gpt4 book ai didi

python - bokeh - 带条件着色的堆叠条形图

转载 作者:太空宇宙 更新时间:2023-11-04 04:32:15 25 4
gpt4 key购买 nike

如何将堆叠条的高度与填充颜色分离?

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

我是 Bokeh 的新手,并且在堆栈条形图机制方面苦苦挣扎。我尝试构建这种类型的图表,但除了各种错误之外,我什么都没有。堆叠条形图的示例在 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
...
]

列代表类别、制度、值(value)、状态。

我想在 x 轴上绘制 Category,在 y 轴上绘制 Regimes,其中条形长度表示值,颜色表示状态。

这在 Bokeh 中可以实现吗?谁能演示一下

最佳答案

如果您将数据转换为以下形式,我认为这个问题会变得容易得多:

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 = []

对于制度中的制度: 如果不是 plotted_regimes: 底部 = 0 别的: 底部=堆栈(*绘制的_regimes) p.vbar(bottom=bottom, top=stack(*plotted_regimes, regime)) plotted_regimes.append(制度)

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

因为堆叠值对应于列名,所以我们必须将这些值放在一个数据框中。开头的 vbar_stack 调用也可以用 stack 编写(主要是因为 vbar_stackstack 的便利包装器).

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

关于python - bokeh - 带条件着色的堆叠条形图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52461910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com