散景散点图中的色点

Dro*_*ror 4 python visualization 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]
    }
)
Run Code Online (Sandbox Code Playgroud)

我的情节如下:

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
Run Code Online (Sandbox Code Playgroud)

我没有按照颜色对点进行颜色编码cat.最终,我希望第一和第三点在相同的颜色,第二和第四点在两种不同的颜色.

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

Hen*_*ndy 9

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

我有问题直接在a上工作pd.DataFrame,并且发现它无法使用你的from_df()电话.文档显示DataFrame直接传递,这对我有用.

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)
Run Code Online (Sandbox Code Playgroud)

  • 这真的是最简单的方法吗?这看起来真的很复杂,我需要添加 2 行和另一个 dict 来做一些在 R 中是 <color = c> 的事情? (2认同)
  • 我最初是出于同样的原因来到这个问题的,而且也来自‘R/ggplot2’,我对‘python’绘图社区的粗鲁感到非常震惊。看看情节; 同样的问题。您必须为每个系列创建列表,这确实看起来很复杂。我发布了这个答案,因为这是我当时能找到的最简单的答案(当然,我对“散景”非常菜鸟)。如果您能找到更简单的方法,请发布另一个答案。 (2认同)

Maa*_*bré -2

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

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