Plotly技术问题:单迹线生成堆叠条形图及单列数据双堆叠图并排实现
嘿,这两个Plotly相关的需求都能轻松搞定!结合你提供的数据框,我一步步给你拆解解决方案:
首先,数据预处理
先把原始的长格式数据转换成适合做堆叠图的汇总格式,用pandas的交叉表就能快速实现:
import pandas as pd # 构建你的数据框 data = { 'Field': ['Police', 'Research', 'Police', 'Banking', 'Healthcare', 'Research', 'Healthcare', 'Banking'], 'Issue': ['Budget cuts', 'Budget cuts', 'Time consuming', 'Lack of support', 'Lack of support', 'Bureaucracy', 'Bureaucracy', 'Budget cuts'] } df = pd.DataFrame(data) # 生成Field和Issue的交叉计数表(用于第一个堆叠图) cross_df = pd.crosstab(df['Field'], df['Issue']) # 生成Issue和Field的交叉计数表(用于第二个堆叠图) cross_df_rev = pd.crosstab(df['Issue'], df['Field'])
问题1:用单迹线生成堆叠条形图
Plotly默认的堆叠条形图会为每个堆叠层生成单独的迹线,但如果要用单个迹线实现堆叠效果,可以借助plotly.graph_objects的Bar组件,把各堆叠层的数值以二维数组形式传入y参数,再开启堆叠模式:
import plotly.graph_objects as go # 单迹线堆叠条形图 fig_single = go.Figure(data=[ go.Bar( x=cross_df.index, # x轴为Field类别 y=[cross_df[col].tolist() for col in cross_df.columns], # 二维数组,每个子数组对应一类Issue的计数 name='Issue Distribution', marker_color=['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728'], # 给每个堆叠层分配专属颜色 text=[cross_df[col].tolist() for col in cross_df.columns], # 显示每个堆叠块的数值标签 textposition='auto' ) ]) fig_single.update_layout( title='单迹线堆叠条形图(Field vs Issue)', xaxis_title='Field', yaxis_title='Count', barmode='stack' # 关键:开启堆叠模式 ) fig_single.show()
这样就用单个迹线实现了堆叠效果,每个Field对应的不同Issue数量会自动堆叠在一起。
问题2:两个堆叠条形图并排展示
当然可以实现!我们用plotly.subplots创建并排的子图布局,每个子图对应一个基于单列分组的堆叠条形图:
from plotly.subplots import make_subplots # 创建1行2列的子图布局 fig = make_subplots( rows=1, cols=2, subplot_titles=('基于Field的堆叠条形图', '基于Issue的堆叠条形图'), horizontal_spacing=0.2 # 调整子图间的间距,避免拥挤 ) # 第一个子图:以Field为x轴,Issue作为堆叠维度 for col in cross_df.columns: fig.add_trace( go.Bar(x=cross_df.index, y=cross_df[col], name=col), row=1, col=1 ) # 第二个子图:以Issue为x轴,Field作为堆叠维度 for col in cross_df_rev.columns: fig.add_trace( go.Bar(x=cross_df_rev.index, y=cross_df_rev[col], name=col), row=1, col=2 ) # 统一设置全局样式 fig.update_layout( title='两个堆叠条形图并排展示', barmode='stack', height=500, width=1000 ) # 给每个子图设置轴标题 fig.update_xaxes(title_text='Field', row=1, col=1) fig.update_xaxes(title_text='Issue', row=1, col=2) fig.update_yaxes(title_text='Count', row=1, col=1) fig.update_yaxes(title_text='Count', row=1, col=2) fig.show()
这里两个子图分别对应基于Field列和Issue列的分组堆叠,完美实现了并排展示的需求。
如果你更习惯用plotly.express,也可以用px.bar(df, x='Field', color='Issue', barmode='stack')快速生成堆叠图,只是底层会自动生成多迹线,视觉效果和单迹线实现的是一致的~
内容的提问来源于stack exchange,提问作者user8322222
相关产品推荐
相关产品推荐

