在散景图中添加其他曲线

时间:2016-03-11 09:01:14

标签: python bokeh

我可以在bokeh.chart.Area图表中添加其他行吗?或者,等效地,有没有办法将图表转换为普通图形,所以我可以手动绘制它?

我有this question中的图表,需要添加额外的曲线。它应该显示为单行,而不是堆积区域图的一部分。

散景:0.11.1,
的Python:2.7

1 个答案:

答案 0 :(得分:4)

您可以使用图表对象的bokeh.models.glyphs.Line方法将新字形(在您的情况下为add_glyph(data_source, glyph)个对象)添加到图表中:

# Create a data source
ds = bokeh.models.sources.ColumnDataSource(dict(x=df['date'], y=[0,3,2]))
# Define the line glyph
line = bokeh.models.glyphs.Line(x='x', y='y', line_width=4, line_color='blue')
# Add the data source and glyph to the plot
p.add_glyph(ds, line)

但是,如果您只是添加该代码,该行将显示在您的图中,但图例中不会有相应的条目。要获取图例条目,您需要将新条目添加到图表对象的内部_legend列表中,然后添加更新的图例。

以下是您的示例:

from datetime import datetime
import pandas as pd
from bokeh.charts import Area, show, output_notebook
import bokeh.models.glyphs
import bokeh.models.sources

df = pd.DataFrame()
df['date'] = [datetime(2016, 1, 1), datetime(2016, 1, 2), datetime(2016, 1, 3)]
df['v1'] = [1, 2, 3]
df['v2'] = [4, 4, 3]

p = Area(df, x='date', y=['v1', 'v2'], title="Area Chart",
         xscale='datetime', stack=True,
         xlabel='time', ylabel='values',
         # We need to disable the automatic legend and add the correct one later
         legend=False)

# Create a data source
ds = bokeh.models.sources.ColumnDataSource(dict(x=df['date'], y=[0,3,2]))
# Define the line glyph
line = bokeh.models.glyphs.Line(x='x', y='y', line_width=4, line_color='blue')
# Add the data source and glyph to the plot
p.add_glyph(ds, line)

# Manually update the legend
legends = p._builders[0]._legends
legends.append( ('x',[p.renderers[-1]] ) )
# Activate the legend
p.legend=True
# Add it to the chart
p.add_legend(legends)

output_notebook()
show(p)