情节:分组和堆叠条形图,堆叠条形图的颜色不同?
Plotly: Grouped and Stacked barchart, different colors for stacked bars?
我有分组和堆叠的条形图。现在我想为以不同颜色堆叠的值着色。我的情节目前看起来像这样(带有标记的部分应该有不同的颜色):
该组对应于一个类别,堆叠基于两个值列之间的增量(增量堆叠在较低值的顶部)。
我想用稍浅的颜色为增量(即堆积条的上部)着色(此处:Cat1
为浅蓝色,Cat1
为浅红色)。
但是,我找不到合适的选择。
我的数据是这样的:
import pandas as pd
data = [
["Station1", 2.5, 3.0, "Cat1"],
["Station1", 3.7, 4.2, "Cat2"],
["Station2", 1.7, 2.1, "Cat1"],
["Station2", 3.9, 4.0, "Cat2"],
]
df = pd.DataFrame(data, columns=["station", "val1", "val2", "category"])
df["delta"] = df["val2"] - df["val1"]
这里是绘图函数:
import plotly.express as px
px.bar(df, x="station", y=["val1", "delta"], color="category", barmode="group").show()
如何为增量着色?解决方案也可以是 plotly(不必是 plotly express)。
有没有办法解决手动计算 delta
列的问题?
我提出了一个应该能很好地满足您的需求的建议。至少在视觉上和 delta >=0
一样长。据我所知,分组和堆叠的条形图仍然有点棘手。但是使用 px.Bar
构建两个不同的图形,然后使用 fig._data 在 go.Figure object()
中将它们组合起来,你可以构建这个:
正如您将从代码中看到的那样,delta
并未明确实现,而是在不透明条和非不透明条之间视觉上出现。如果这是你可以使用的东西,我会看看我是否可以在 hoverinfo 中包含 delta
。
完整代码:
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
data = [
["Station1", 2.5, 3.0, "Cat1"],
["Station1", 3.7, 4.2, "Cat2"],
["Station2", 1.7, 2.1, "Cat1"],
["Station2", 3.9, 4.0, "Cat2"],
]
df = pd.DataFrame(data, columns=["station", "val1", "val2", "category"])
df["delta"] = df["val2"] - df["val1"]
fig1_data = px.bar(df, x="station", y=["val1"], color="category", barmode="group")._data
fig2_data = px.bar(df, x="station", y=['val2'], color="category", barmode="group")._data
fig1_data[0]['marker']['color'] = 'rgba(255,0,0,1)'
fig1_data[1]['marker']['color'] = 'rgba(0,0,255,1)'
fig2_data[0]['marker']['color'] = 'rgba(255,0,0,0.2)'
fig2_data[1]['marker']['color'] = 'rgba(0,0,255,0.2)'
dat = fig1_data+fig2_data
fig = go.Figure(dat)
fig3 = go.Figure(fig._data)
fig.update_layout(barmode='relative', title_text='Relative Barmode')
fig3.show()
我有分组和堆叠的条形图。现在我想为以不同颜色堆叠的值着色。我的情节目前看起来像这样(带有标记的部分应该有不同的颜色):
该组对应于一个类别,堆叠基于两个值列之间的增量(增量堆叠在较低值的顶部)。
我想用稍浅的颜色为增量(即堆积条的上部)着色(此处:Cat1
为浅蓝色,Cat1
为浅红色)。
但是,我找不到合适的选择。
我的数据是这样的:
import pandas as pd
data = [
["Station1", 2.5, 3.0, "Cat1"],
["Station1", 3.7, 4.2, "Cat2"],
["Station2", 1.7, 2.1, "Cat1"],
["Station2", 3.9, 4.0, "Cat2"],
]
df = pd.DataFrame(data, columns=["station", "val1", "val2", "category"])
df["delta"] = df["val2"] - df["val1"]
这里是绘图函数:
import plotly.express as px
px.bar(df, x="station", y=["val1", "delta"], color="category", barmode="group").show()
如何为增量着色?解决方案也可以是 plotly(不必是 plotly express)。
有没有办法解决手动计算 delta
列的问题?
我提出了一个应该能很好地满足您的需求的建议。至少在视觉上和 delta >=0
一样长。据我所知,分组和堆叠的条形图仍然有点棘手。但是使用 px.Bar
构建两个不同的图形,然后使用 fig._data 在 go.Figure object()
中将它们组合起来,你可以构建这个:
正如您将从代码中看到的那样,delta
并未明确实现,而是在不透明条和非不透明条之间视觉上出现。如果这是你可以使用的东西,我会看看我是否可以在 hoverinfo 中包含 delta
。
完整代码:
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
data = [
["Station1", 2.5, 3.0, "Cat1"],
["Station1", 3.7, 4.2, "Cat2"],
["Station2", 1.7, 2.1, "Cat1"],
["Station2", 3.9, 4.0, "Cat2"],
]
df = pd.DataFrame(data, columns=["station", "val1", "val2", "category"])
df["delta"] = df["val2"] - df["val1"]
fig1_data = px.bar(df, x="station", y=["val1"], color="category", barmode="group")._data
fig2_data = px.bar(df, x="station", y=['val2'], color="category", barmode="group")._data
fig1_data[0]['marker']['color'] = 'rgba(255,0,0,1)'
fig1_data[1]['marker']['color'] = 'rgba(0,0,255,1)'
fig2_data[0]['marker']['color'] = 'rgba(255,0,0,0.2)'
fig2_data[1]['marker']['color'] = 'rgba(0,0,255,0.2)'
dat = fig1_data+fig2_data
fig = go.Figure(dat)
fig3 = go.Figure(fig._data)
fig.update_layout(barmode='relative', title_text='Relative Barmode')
fig3.show()