散景-具有灵活映射功能的多线折线图

时间:2019-04-29 09:58:09

标签: python plot bokeh timeserieschart

我有以下格式的Pandas DataFrame

name -  date   - score
 A   - 1/1/10  - 100
 A   - 1/2/10  - 200
 A   - 1/3/10  - 300
 B   - 1/1/10  - 150
 B   - 1/2/10  - 400
 B   - 1/3/10  - 600

我想创建一个散景图,在x轴上具有日期,在y轴上具有得分,并且每个名称都有单独的线条+颜色。我正在使用Jupyter笔记本电脑。

这里有一些测试数据,尽管我想得到一些名称中可用于任意数量的/值的东西,而不只是A和B。

import pandas as pd
import datetime
test_data = {'name':['A','A','A','B','B','B'],
        'date':[datetime.date(2010,1,1),
               datetime.date(2010,2,1),
              datetime.date(2010,3,1),
              datetime.date(2010,1,1),
              datetime.date(2010,2,1),
              datetime.date(2010,3,1),],
        'score':[100,200,300,150,400,600]}

plot_df = pd.DataFrame(test_data)

使用Seaborn,我会这样做。

import seaborn as sns
ax = sns.lineplot(data=plot_df, x='date',y='score',hue='name')

我想知道使用Bokeh做同一件事的最有效方法吗?

我可以这样画一个球员。

import bokeh.plotting as bp
bp.output_notebook()

filtered_df = plot_df[plot_df.player == 'A'].sort_values(by=['date'])
plot_ds = bp.ColumnDataSource(filtered_df)
plot = bp.figure()
plot.line('date','score',source=plot_ds)
bp.show(plot)

我想知道如何使它适用于任意数量的不同名称。同样,我需要它对更改不同名称的名称具有鲁棒性。

我认为我应该以某种方式使用colormapper,但是对于确切地合并它却感到困惑?我还看到还有另一个答案here,它对变量->颜色映射进行了硬编码,并试图考虑将其概括的最简单方法。

编辑-多折线图的每个名称也都需要一个图例,类似于Seaborn的示例。

下一步将使它起作用,以便您可以使用滑块+单选按钮动态更改名称和日期范围,但是我想首先使这个简单的图起作用。这就是为什么我不只是坚持Seaborn。

1 个答案:

答案 0 :(得分:2)

也许是这样的(对于Bokeh 1.1.0):

implementation 'com.android.support:design:28.0.0'

或使用import pandas as pd import datetime import bokeh.plotting as bp from bokeh.palettes import Category10 test_data = {'name': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'], 'date': [datetime.date(2010, 1, 1), datetime.date(2010, 2, 1), datetime.date(2010, 3, 1), datetime.date(2010, 1, 1), datetime.date(2010, 2, 1), datetime.date(2010, 3, 1), datetime.date(2010, 1, 1), datetime.date(2010, 2, 1), datetime.date(2010, 3, 1), ], 'score': [100, 200, 300, 150, 400, 600, 150, 250, 400]} plot_df = pd.DataFrame(test_data) gby = plot_df.groupby('name') names = list(gby.groups.keys()) palette = Category10[len(names)] plot_df['color'] = [palette[names.index(x)] for i, sdf in gby for x in sdf['name']] plot = bp.figure(x_axis_type = 'datetime') gby.apply(lambda d: plot.line('date', 'score', line_color = d['color'].unique()[0], line_width = 3, legend = d['name'].unique()[0], source = d)) bp.show(plot)

multi_line

结果(两个选项):

enter image description here