python Bokeh 散点图中的色点


我有以下简单的pandas.DataFrame

df = pd.DataFrame(
 {
 "journey": ['ch1', 'ch2', 'ch2', 'ch1'],
 "cat": ['a', 'b', 'a', 'c'],
 "kpi1": [1,2,3,4],
 "kpi2": [4,3,2,1]
 }
)

我绘制如下:

import bokeh.plotting as bpl
import bokeh.models as bmo
bpl.output_notebook()
source = bpl.ColumnDataSource.from_df(df)
hover = bmo.HoverTool(
 tooltips=[
 ("index", "@index"),
 ('journey', '@journey'),
 ("Cat", '@cat')
 ]
)
p = bpl.figure(tools=[hover])
p.scatter(
 'kpi1',
 'kpi2', source=source)
bpl.show(p) # open a browser

我未能根据cat. 最终,我希望第一个和第三个点使用相同的颜色,第二个和第四个点使用另外两种不同的颜色。

如何使用 Bokeh 实现这一目标?

回答by Hendy

这是一种在某种程度上避免手动映射的方法。我最近偶然的bokeh.palettes,在这个问题github上,以及CategoricalColorMapper这个问题上。这种方法结合了它们。在此处查看可用调色板的完整列表,并在此处查看CategoricalColorMapper详细信息。

我在让这个直接在 a 上工作时遇到了问题pd.DataFrame,并且还发现它在使用你的from_df()电话时不起作用。文档显示DataFrame直接传递 a ,这对我有用。

import pandas as pd
import bokeh.plotting as bpl
import bokeh.models as bmo
from bokeh.palettes import d3
bpl.output_notebook()
df = pd.DataFrame(
 {
 "journey": ['ch1', 'ch2', 'ch2', 'ch1'],
 "cat": ['a', 'b', 'a', 'c'],
 "kpi1": [1,2,3,4],
 "kpi2": [4,3,2,1]
 }
)
source = bpl.ColumnDataSource(df)
# use whatever palette you want...
palette = d3['Category10'][len(df['cat'].unique())]
color_map = bmo.CategoricalColorMapper(factors=df['cat'].unique(),
 palette=palette)
# create figure and plot
p = bpl.figure()
p.scatter(x='kpi1', y='kpi2',
 color={'field': 'cat', 'transform': color_map},
 legend='cat', source=source)
bpl.show(p)

回答by Dror

For the sake of completeness, here is the adapted code using low-levelchart:

为了完整起见,这里是使用低级图表的改编代码:

import pandas as pd
import bokeh.plotting as bpl
import bokeh.models as bmo
bpl.output_notebook()
df = pd.DataFrame(
 {
 "journey": ['ch1', 'ch2', 'ch2', 'ch1'],
 "cat": ['a', 'b', 'a', 'c'],
 "kpi1": [1,2,3,4],
 "kpi2": [4,3,2,1],
 "color": ['blue', 'red', 'blue', 'green']
 }
)
df
source = bpl.ColumnDataSource.from_df(df)
hover = bmo.HoverTool(
 tooltips=[
 ('journey', '@journey'),
 ("Cat", '@cat')
 ]
)
p = bpl.figure(tools=[hover])
p.scatter(
 'kpi1',
 'kpi2', source=source, color='color')
bpl.show(p)

Note that the colors are "hard-coded" into the data.

请注意,颜色是“硬编码”到数据中的。

Here is the alternative using high-levelchart:

这是使用高级图表的替代方法:

import pandas as pd
import bokeh.plotting as bpl
import bokeh.charts as bch
bpl.output_notebook()
df = pd.DataFrame(
 {
 "journey": ['ch1', 'ch2', 'ch2', 'ch1'],
 "cat": ['a', 'b', 'a', 'c'],
 "kpi1": [1,2,3,4],
 "kpi2": [4,3,2,1]
 }
)
tooltips=[
 ('journey', '@journey'),
 ("Cat", '@cat')
 ]
scatter = bch.Scatter(df, x='kpi1', y='kpi2',
 color='cat',
 legend="top_right",
 tooltips=tooltips
 )
bch.show(scatter)

回答by Maarten Fabré

你可以Scatter像这里一样使用更高级别

or provide a color column to the ColumnDataSourceand reference it in your p.scatter(..., color='color_column_label')

或提供一个颜色列ColumnDataSource并在您的p.scatter(..., color='color_column_label')


原文链接:https://codingdict.com/