如何将填充条的高度与填充颜色分开?
我想在堆叠条形图中显示多个类别,以便高度代表值,颜色由另一个变量(如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轴上堆叠的区域,其中条形长度表示值,颜色表示状态。
在散景中可以实现吗? 有人可以演示吗
答案 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个点/矩形/形状/事物:
source[column_name]
必须产生长度为n的“数组”)但是vbar_stack
不会创建一个渲染器,它会创建与您给定的第一个数组中的元素一样多的渲染器。让我们将此数字称为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_stack
是stack
周围的便利包装)。
使用factor_cmap
使得我们不必手动分配颜色。我们也可以简单地添加一个Regime1_Color
列,但是这样映射是自动完成的(和客户端)。