我正在尝试使用创建Sankey图,bokeh并且当前正在尝试弄清楚如何填充两条Bezier曲线之间的区域。这是否可能,或者是否有任何其他方法可以实现而无需添加单个Bezier字形?下面的示例代码-目标是用橙色填充曲线之间的区域。from bokeh.models import Range1d, Plot, LinearAxisfrom bokeh.models.glyphs import Bezierfrom bokeh.io import showplot = Plot(title=None, x_range=Range1d(0, 1), y_range=Range1d(-1, 1), plot_width=300, plot_height=300)glyph = Bezier(x0=0, y0=0, x1=1, y1=1, cx0=0.5, cy0=0.01, cx1=0.5, cy1=0.99, line_color="orange", line_width=2)glyph2 = Bezier(x0=0, y0=-1, x1=1, y1=0.5, cx0=0.5, cy0=-0.99, cx1=0.5, cy1=0.49, line_color="orange", line_width=2)g1 = plot.add_glyph(glyph)g2 = plot.add_glyph(glyph2)xaxis = LinearAxis()plot.add_layout(xaxis, 'below')yaxis = LinearAxis()plot.add_layout(yaxis, 'left')show(plot)
1 回答
千万里不及你
TA贡献1784条经验 获得超9个赞
从Bokeh开始0.13.0,无法使用任何内置功能在两条Bézier曲线之间填充。当前,要实现此目的,您将必须编写某种自定义扩展类,该类使用输入数据并绘制曲线并使用HTML Canvas JavaScript API进行填充。
否则,如果能够将曲线表示为明确的折线而不是Bézier曲线,则下一个最接近的东西是Band注释。假设数据框包含x,,y_mean和y_std,您可以执行以下操作:
df['lower'] = df.y_mean - df.y_std
df['upper'] = df.y_mean + df.y_std
source = ColumnDataSource(df.reset_index())
band = Band(base='x', lower='lower', upper='upper', source=source,
level='underlay', fill_alpha=1.0, line_width=1, line_color='black')
p.add_layout(band)
可能可以考虑添加一个更通用的波段,该波段可以由诸如贝塞尔曲线之类的东西指定。
添加回答
举报
0/150
提交
取消