私は次の簡単な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
に従ってドットを色分けできません。最終的には、1番目と3番目のポイントを同じ色にし、2番目と4番目のポイントをさらに2つの異なる色にします。
Bokehを使用してこれを実現するにはどうすればよいですか?
これは、手動マッピングをある程度回避する方法です。私は最近、 このgithubの問題 で_bokeh.palettes
_に遭遇し、 この問題 でCategoricalColorMapper
に遭遇しました。このアプローチはそれらを組み合わせたものです。使用可能なパレットの完全なリストを参照してください ここ およびCategoricalColorMapper
の詳細 ここ 。
これを_pd.DataFrame
_で直接機能させるのに問題があり、from_df()
呼び出しを使用しても機能しないことがわかりました。 docsDataFrame
を直接渡すことを示していますが、それは私にとってはうまくいきました。
_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)
_
完全を期すために、低レベルチャートを使用して適合させたコードを次に示します。
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)
色はデータに「ハードコード」されていることに注意してください。
高レベルチャートを使用する代替方法は次のとおりです。
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)
here のように上位レベルのScatter
を使用できます
または、ColumnDataSource
にカラー列を指定して、p.scatter(..., color='color_column_label')
で参照します。