基于Plotly实现总量占比与细分群体占比的柱状图方案问询
报纸发行量可视化优化方案(Plotly实现)
核心优化思路
结合堆叠柱状图保留绝对发行量量级的优势,通过自定义标注突出三个关键占比,同时用颜色分层区分不同区域的发行量:
- 堆叠柱体:用不同颜色区分「非美国发行量」「美国非加州发行量」「加州发行量」,直观展示各报纸的总发行量及结构
- 双侧标注:
- 柱子左侧:标注总发行量+加州占总发行量的比例
- 柱子右侧:标注美国发行量+美国占总发行量的比例+加州占美国发行量的比例
完整实现代码
import pandas as pd import plotly.express as px # 原始数据 data = { 'Name': ['Paper A', 'Paper B'], 'Total circ': [1000000, 800000], 'US circ': [500000, 200000], 'CA': [100000, 100000] } df = pd.DataFrame.from_dict(data) # 计算拆分的发行量部分 df['not US'] = df['Total circ'] - df['US circ'] df['not CA'] = df['US circ'] - df['CA'] # 计算三个关键占比(格式化百分比) df['US_pct_total'] = (df['US circ'] / df['Total circ']).apply(lambda x: f"{x:.0%}") df['CA_pct_US'] = (df['CA'] / df['US circ']).apply(lambda x: f"{x:.0%}") df['CA_pct_total'] = (df['CA'] / df['Total circ']).apply(lambda x: f"{x:.0%}") # 创建堆叠柱状图 fig = px.bar( df, x='Name', y=['not US', 'not CA', 'CA'], color_discrete_map={ 'not US': '#e0e0e0', # 浅灰:非美国发行量 'not CA': '#93c5fd', # 浅蓝:美国非加州发行量 'CA': '#2563eb' # 深蓝:加州发行量 }, labels={'value': '发行量', 'variable': '发行量区域'}, title='报纸全球/美国/加州发行量及占比分析' ) # 添加左侧标注:总发行量 + 加州占总比例 for idx, row in df.iterrows(): fig.add_annotation( x=row['Name'], y=row['Total circ'] / 2, # 垂直居中 xshift=-80, # 向左偏移 text=f"总发行量:{row['Total circ']/10000:.1f}万\nCA占总:{row['CA_pct_total']}", showarrow=False, font={'size': 10} ) # 添加右侧标注:美国发行量 + 美国占总比例 + 加州占美国比例 for idx, row in df.iterrows(): fig.add_annotation( x=row['Name'], y=row['Total circ'] / 2, # 垂直居中 xshift=80, # 向右偏移 text=f"US发行量:{row['US circ']/10000:.1f}万\nUS占总:{row['US_pct_total']}\nCA占US:{row['CA_pct_US']}", showarrow=False, font={'size': 10} ) # 布局优化:调整图例位置、y轴范围 fig.update_layout( legend=dict(orientation='h', yanchor='bottom', y=1.02, xanchor='right', x=1), yaxis_range=[0, df['Total circ'].max() * 1.1], # y轴预留空间避免标注遮挡 margin=dict(l=120, r=120) # 左右边距适配标注 ) fig.show()
效果说明
- 绝对量展示:堆叠柱体的高度直接对应报纸总发行量,不同颜色块清晰区分非美国、美国非加州、加州的发行量规模
- 占比信息突出:双侧标注集中展示三个关键比例,无需额外计算即可快速获取各层级占比关系
- 批量适配性:代码可直接扩展到更多报纸数据,标注会自动匹配每个报纸的数值,便于批量分析趋势
内容的提问来源于stack exchange,提问作者eschares
相关产品推荐
相关产品推荐

