使用 Bokeh 绘制两个曲线之间的区域填充色

3

我有一个带有Bokeh的代码。有两个数学函数,在区间[0,2]内存在这两个函数之间的区域。我该如何用颜色填充此区域?我不能使用多边形,因为它不是多边形。以下是代码:

import numpy as np
from bokeh.plotting import *


N = 300
x0 = np.linspace(-1, 4, N)
x1 = np.linspace(0, 4, N)
y0 = 0.5 * (x0 ** 2)
y1 = np.sqrt(2 * x1)
y2 = -y1

# output to static HTML file
output_file('plotting_areas.html')

TOOLS = 'pan, wheel_zoom, box_zoom, reset,save, box_select, lasso_select'

p = figure(tools=TOOLS, width=350, height=350,
           title=None, x_range=(-1, 5), y_range=(-5, 5))
p.line(x0, y0)
p.line(x1, y1)
p.line(x1, y2)

show(p)

这里有一张图片,用于更详细的说明。 两个函数

谢谢

3个回答

1

Bokeh中没有内置的功能可以执行像洪水填充这样的操作,这确实是所需的。您最好自己计算面积的多边形近似值。

否则,您可以(原则上)创建一个自定义扩展程序以在JavaScript中执行洪水填充,但我不确定需要多少工作量。


多边形逼近在这个问题上并不可行,因为我有许多其他的情节也存在这个问题。我测试了D3库,结果还是一样的问题。我不懂足够的JavaScript来制作插件。 - Tobal
1
这里有一篇文章描述了HTML画布上高效的泛洪填充算法:http://www.williammalone.com/articles/html5-canvas-javascript-paint-bucket-tool/ 我建议您在Bokeh GitHub问题跟踪器上提出功能请求,以便我们考虑它。 - bigreddot

1

好的,我已经找到了使用bokeh解决方案,它非常简单而且可行。关键是使用两个向量(数组)来表示OX区间内每两个数学函数之间的图像。对于每个向量,使用patch bokeh指令制作一个没有边框线的多边形。 以下是代码:

import numpy as np
from bokeh.plotting import *


N = 300
x0 = np.linspace(-1, 4, N)
x1 = np.linspace(0, 4, N)
y0 = 0.5 * (x0 ** 2)
y1 = np.sqrt(2 * x1)
y2 = -y1


def f1(x):
    return 0.5 * (x**2)


def f2(x):
    return np.sqrt(2 * x)


z = np.zeros(N)
w = np.zeros(N)
x = np.linspace(0, 2, N)
for i in np.arange(len(x)):
    z[i] = f1(x[i])
    w[i] = f2(x[i])

# output to static HTML file
output_file('plotting_areas.html')

TOOLS = 'pan, wheel_zoom, box_zoom, reset,save, box_select, lasso_select'

p = figure(tools=TOOLS, width=350, height=350,
           title=None, x_range=(-1, 5), y_range=(-5, 5))
p.line(x0, y0)
p.line(x1, y1)
p.line(x1, y2)
p.patch(x, z, color='red')
p.patch(x, w, color='red')

show(p)

这里是一个带有最佳解决方案的图像:

The solution image

谢谢


这就是我一开始建议你做的。 - bigreddot
1
我感到困惑,我在考虑泰勒或贝塞尔。后来我想到了这个解决方案,但我不确定它是否是最优解。所以我尝试了一下。这个解决方案也适用于D3 js。无论如何,非常感谢你。现在其他人也有了一个可能的解决方案。 - Tobal

0

现在有VArea可以完成这个技巧。也许您想将绘图范围限制为f1 > f2。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接