python-散景-带条件着色的堆积条形图

时间:2018-09-23 00:11:19

标签: python plot bokeh

如何将填充条的高度与填充颜色分开?

我想在堆叠条形图中显示多个类别,以便高度代表值,颜色由另一个变量(如ggplot中的fill =)有条件地定义。

我对散景和堆栈条形图机制不熟悉。我试过构造这种类型的图表,但是除了各种错误之外,我什么也没有。堆积的条形图的示例在bokeh文档中非常有限。

我的数据存储在pandas数据框中:

data =
['A',1, 15, 1]
'A',2, 14, 2
'A',3, 60, 1
'B',1, 15, 2
'B',2, 25, 2
'B',3, 20, 1
'C',1, 15, 1
'C',2, 25, 1
'C',3, 55, 2
...
]

列代表类别,制度,价值,状态。

我想在x轴上绘制类别,在y轴上堆叠的区域,其中条形长度表示值,颜色表示状态。

在散景中可以实现吗? 有人可以演示吗

1 个答案:

答案 0 :(得分:1)

我认为,如果将数据转换为以下格式,此问题将变得更加容易

from bokeh.plotting import figure
from bokeh.io import show
from bokeh.transform import stack, factor_cmap
import pandas as pd

df = pd.DataFrame({
    "Category": ["a", "b"],
    "Regime1_Value": [1, 4], 
    "Regime1_State": ["A", "B"],
    "Regime2_Value": [2, 5], 
    "Regime2_State": ["B", "B"],
    "Regime3_Value": [3, 6], 
    "Regime3_State": ["B", "A"]})

p = figure(x_range=["a", "b"])
p.vbar_stack(["Regime1_Value", "Regime2_Value", "Regime3_Value"],
        x="Category",
        fill_color=[
            factor_cmap(state, palette=["red", "green"], factors=["A", "B"]) 
            for state in ["Regime1_State","Regime2_State", "Regime3_State"]],
        line_color="black",
        width=0.9,
        source=df)

show(p)

这有点奇怪,因为vbar_stack的行为不同于“正常字形”。通常,渲染器的属性有三个选项(假设我们要绘制n个点/矩形/形状/事物:

  • 给出一个可用于所有n个字形的值
  • 给出在源中查找的列名(source[column_name]必须产生长度为n的“数组”)
  • 给出长度为n的数据数组

但是vbar_stack不会创建一个渲染器,它会创建与您给定的第一个数组中的元素一样多的渲染器。让我们将此数字称为k。然后,要了解这些属性,您可以再次使用三个选项:

  • 给出用于所有字形的单个值
  • 给出k个数组作为源中的列名(每次查找必须生成长度为n的数组)。
  • 给出一个长度为n的数据数组(因此,所有1-k字形都具有相同的数据)。

因此p.vbar(x=[a,b,c])p.vbar_stacked(x=[a,b,c])实际上做了不同的事情(第一个提供文字数据,第二个提供列名称),这令人困惑,文档中尚不清楚。

但是为什么我们必须如此奇怪地转换您的数据?让我们展开vbar_stack并自行编写(为简洁起见,不再赘述):

plotted_regimes = []

对于制度中的制度:     如果没有plot_regimes:         底部= 0     其他:         底部=堆栈(* plotted_regimes)     p.vbar(底部=底部,顶部=堆栈(* plotted_regimes,体制))     plot_regimes.append(regime)

因此,对于每个方案,我们都有一个单独的vbar,其vbar的底部是其他方案的总和。现在,使用原始数据结构实际上是不可能的,因为不必为每个类别的每个方案都设置一个值。如果需要,在这里我们必须将这些值设置为0。

由于堆积的值与列名相对应,因此我们必须将这些值放在一个数据帧中。开头的vbar_stack调用也可以用stack编写(主要是因为vbar_stackstack周围的便利包装)。

使用factor_cmap使得我们不必手动分配颜色。我们也可以简单地添加一个Regime1_Color列,但是这样映射是自动完成的(和客户端)。