我有一个带有两个数据列的pandas数据框(为简单起见,我们将它们称为'x'和'y'),以及一个分类列(比如'color',其值为'red','green'和'blue “)。现在我想使用散景来生成带有不同标记符号的散点图('红色' - >'x','绿色' - >'o'和'蓝色' - >'三角')。
虽然我找到了一个解决方案,我手动提取了'x'和'y'值的相关部分,但我认为应该可以在一个命令中使用散景中的“分类”绘图来完成此操作。但是,文档主要考虑条形图,当我尝试在ColumnDataSource中使用df.groupby('color')的结果时,在散布(使用source = source)中绘制'x'和'y'失败,因为列找不到名字'x'和'y'。
以下是说明问题的示例代码:
import pandas as pd
import bokeh.plotting as plt
df = pd.DataFrame(data=[[0., 0., 'red'], [1., 0., 'red'], [1., 1., 'green'],
[1., 2., 'blue'], [2., 1., 'blue']],
columns=['x', 'y', 'color'])
source = plt.ColumnDataSource(df.groupby('color'))
# source = plt.ColumnDataSource(df) -- this would work for colors
fig = plt.figure()
fig.scatter('x', 'y', color='color', source=source)
plt.show(fig)
此代码段显示了所需的最低要求。没有groupby,color ='color'实际上有效,但在我的实例中,分类变量具有非颜色值。此外,我如何指定多个符号?
答案 0 :(得分:1)
将GroupBy
传递给CDS对您没有帮助,因为这会创建汇总数据的CDS ,但您需要所有单独的点。以下是CDSView
中描述的使用GroupFilter
和import pandas as pd
from bokeh.io import show
from bokeh.models import ColumnDataSource, CDSView, GroupFilter
from bokeh.plotting import figure
df = pd.DataFrame(data=[[0., 0., 'red'], [1., 0., 'red'], [1., 1., 'green'],
[1., 2., 'blue'], [2., 1., 'blue']],
columns=['x', 'y', 'color'])
source = ColumnDataSource(df)
# create views for the different groups
red = CDSView(source=source, filters=[GroupFilter(column_name='color', group='red')])
green = CDSView(source=source, filters=[GroupFilter(column_name='color', group='green')])
blue = CDSView(source=source, filters=[GroupFilter(column_name='color', group='blue')])
p = figure()
# use the views with different glyphs
p.circle('x', 'y', size=15, color='red', source=source, view=red)
p.square('x', 'y', size=15, color='green', source=source, view=green)
p.triangle('x', 'y', size=15, color='blue', source=source, view=blue)
show(p)
完成所要求的一种方法:
source.group
Providing Data for Plots and Tables
看来似乎有一些非常简单易行的改进可以减少代码量(例如,可能CDSView
方法来完成那些$(.product_qty).val();
行所做的所有工作,或者可能是指定组的字形方法的参数)。我鼓励您提交进一步讨论。