如何通过条形图的值指定条形的颜色?

时间:2019-08-18 10:30:32

标签: bokeh python-3.7

好吧,我创建了一个条形图,现在我想根据其在y轴上的值指定条形的颜色。简化-如果值是正数,则条形图应为红色,如果值是负数,则条形图应为蓝色。

对我来说,只能沿x轴更改颜色,而不能沿y轴更改颜色。


from bokeh.palettes import plasma

source = ColumnDataSource(data={'date' : pd.to_datetime(df_data['date'], format='%Y-%m'), 'values' : df_data['values'], 'color' : plasma(256)})

p = figure(x_axis_label='time',
           x_axis_type='datetime',
           y_axis_label='diff',
           tools = [hover]
           toolbar_location=None
           title="title")

p.vbar(x = 'date',top = 'values', source=source, width=timedelta(days=20), color = 'color')

我发现了以下示例: https://docs.bokeh.org/en/latest/docs/user_guide/categorical.html

但是我需要根据它们的值(不取决于其数量)来区分或着色这些条。我知道我的榜样没有道理,但我只想证明我的期望是什么。

1 个答案:

答案 0 :(得分:0)

好吧,我通过取消熊猫的cut功能找到了自己的解决方案。

import pandas as pd
import numpy as np

values = array(df_data['values']).values)
bins = [np.NINF, 0, np.inf]

categories = pd.cut(values, bins, right=False)

palette = ['blue', 'red']

colors = []

for i in categories.codes:
    colors.append[palette[i]]

# Now i can add this column to my ColumnDataSource:
source = ColumnDataSource(data={'date' : pd.to_datetime(df_data['date'], format='%Y-%m'), 'values' : df_data['values'], 'color' : colors}

p.vbar(x = 'date',top = 'values', source=source, width=timedelta(days=20), color = 'colors')

当然,这就像“快速而肮脏的”解决方案一样,并且有足够的优化空间。