使用 Bokeh 和 pandas 绘制多条线
Plotting multiple lines with Bokeh and pandas
我想给 Bokeh 一个 pandas 数据框来绘制多条折线图。
x 轴应该是 df.index 并且每个 df.columns 应该是单独的一行。
这就是我想做的事情:
import pandas as pd
import numpy as np
from bokeh.plotting import figure, show
toy_df = pd.DataFrame(data=np.random.rand(5,3), columns = ('a', 'b' ,'c'), index = pd.DatetimeIndex(start='01-01-2015',periods=5, freq='d'))
p = figure(width=1200, height=900, x_axis_type="datetime")
p.multi_line(df)
show(p)
但是,我收到错误:
RuntimeError: Missing required glyph parameters: ys
相反,我设法做到了:
import pandas as pd
import numpy as np
from bokeh.plotting import figure, show
toy_df = pd.DataFrame(data=np.random.rand(5,3), columns = ('a', 'b' ,'c'), index = pd.DatetimeIndex(start='01-01-2015',periods=5, freq='d'))
ts_list_of_list = []
for i in range(0,len(toy_df.columns)):
ts_list_of_list.append(toy_df.index)
vals_list_of_list = toy_df.values.T.tolist()
p = figure(width=1200, height=900, x_axis_type="datetime")
p.multi_line(ts_list_of_list, vals_list_of_list)
show(p)
这(不恰当地)完成了工作,但所有 3 行都使用相同的颜色,见下文:
问题:
1) 如何将 pandas 数据帧传递给散景的 multi_line?
2) 如果不能直接操作,我如何操作数据帧数据,以便 multi_line 将创建具有不同颜色的每一行?
提前致谢。
您需要向 multi_line 提供颜色列表。在您的示例中,您会这样做:
p.multi_line(ts_list_of_list, vals_list_of_list, line_color=['red', 'green', 'blue'])
这是对你的第二个例子的更通用的修改,它或多或少做了你最终得到的东西,但更简洁一点,也许更像 Pythonic:
import pandas as pd
import numpy as np
from bokeh.palettes import Spectral11
from bokeh.plotting import figure, show, output_file
output_file('temp.html')
toy_df = pd.DataFrame(data=np.random.rand(5,3), columns = ('a', 'b' ,'c'), index = pd.DatetimeIndex(start='01-01-2015',periods=5, freq='d'))
numlines=len(toy_df.columns)
mypalette=Spectral11[0:numlines]
p = figure(width=500, height=300, x_axis_type="datetime")
p.multi_line(xs=[toy_df.index.values]*numlines,
ys=[toy_df[name].values for name in toy_df],
line_color=mypalette,
line_width=5)
show(p)
产生:
维护者注意:bokeh.charts
API 已在多年前弃用并删除
已过时:
您需要绘制时间序列图表。这将允许您轻松插入图例。 TimeSeries 属性可能位于 bokeh._legacy_charts 下。请参阅位于此处的以下示例:
我想给 Bokeh 一个 pandas 数据框来绘制多条折线图。
x 轴应该是 df.index 并且每个 df.columns 应该是单独的一行。
这就是我想做的事情:
import pandas as pd
import numpy as np
from bokeh.plotting import figure, show
toy_df = pd.DataFrame(data=np.random.rand(5,3), columns = ('a', 'b' ,'c'), index = pd.DatetimeIndex(start='01-01-2015',periods=5, freq='d'))
p = figure(width=1200, height=900, x_axis_type="datetime")
p.multi_line(df)
show(p)
但是,我收到错误:
RuntimeError: Missing required glyph parameters: ys
相反,我设法做到了:
import pandas as pd
import numpy as np
from bokeh.plotting import figure, show
toy_df = pd.DataFrame(data=np.random.rand(5,3), columns = ('a', 'b' ,'c'), index = pd.DatetimeIndex(start='01-01-2015',periods=5, freq='d'))
ts_list_of_list = []
for i in range(0,len(toy_df.columns)):
ts_list_of_list.append(toy_df.index)
vals_list_of_list = toy_df.values.T.tolist()
p = figure(width=1200, height=900, x_axis_type="datetime")
p.multi_line(ts_list_of_list, vals_list_of_list)
show(p)
这(不恰当地)完成了工作,但所有 3 行都使用相同的颜色,见下文:
问题:
1) 如何将 pandas 数据帧传递给散景的 multi_line?
2) 如果不能直接操作,我如何操作数据帧数据,以便 multi_line 将创建具有不同颜色的每一行?
提前致谢。
您需要向 multi_line 提供颜色列表。在您的示例中,您会这样做:
p.multi_line(ts_list_of_list, vals_list_of_list, line_color=['red', 'green', 'blue'])
这是对你的第二个例子的更通用的修改,它或多或少做了你最终得到的东西,但更简洁一点,也许更像 Pythonic:
import pandas as pd
import numpy as np
from bokeh.palettes import Spectral11
from bokeh.plotting import figure, show, output_file
output_file('temp.html')
toy_df = pd.DataFrame(data=np.random.rand(5,3), columns = ('a', 'b' ,'c'), index = pd.DatetimeIndex(start='01-01-2015',periods=5, freq='d'))
numlines=len(toy_df.columns)
mypalette=Spectral11[0:numlines]
p = figure(width=500, height=300, x_axis_type="datetime")
p.multi_line(xs=[toy_df.index.values]*numlines,
ys=[toy_df[name].values for name in toy_df],
line_color=mypalette,
line_width=5)
show(p)
产生:
维护者注意:bokeh.charts
API 已在多年前弃用并删除
已过时:
您需要绘制时间序列图表。这将允许您轻松插入图例。 TimeSeries 属性可能位于 bokeh._legacy_charts 下。请参阅位于此处的以下示例: