如何在Plotly中绘制单根普通条形与堆叠条形并列的图表
解决方案
核心问题说明
你之前的实现无法达到效果的核心原因是维度对齐错误:要实现单根独立条形+旁边单根堆叠条形的效果,需要把X轴设置为两个类别:[第一名国家名称, '其他国家'],第一名的数值对应第一个分类位置,所有要堆叠的剩余国家数值都对应第二个分类位置,开启堆叠模式后会自动在第二个分类位置叠成一根堆叠条。
完整可运行代码
import plotly.graph_objects as go import pandas as pd # 你已经实现的拆分函数 def find_next_series_equivalent(series): primary = series[0] if series[1:-1].sum() > primary: i = 2 while series[1:i].sum() < primary: i += 1 return series[1:i] else: return series[1:-1] # -------------- 数据处理 -------------- # 拿到国家计数Series CountryCounts = OGdf['Country'].value_counts() top_country = CountryCounts.index[0] top_count = CountryCounts.iloc[0] # 拿到要堆叠的剩余国家数据,也可直接用 CountryCounts[1:] 取所有剩余国家 stack_countries = find_next_series_equivalent(CountryCounts) # -------------- 绘图 -------------- fig = go.Figure() # 添加第一名的独立条形 fig.add_trace(go.Bar( x = [top_country], y = [top_count], name = top_country, hovertemplate = f"国家:{top_country}<br>数量:%{{y}}<extra></extra>" )) # 批量添加堆叠的其他国家条形,所有条目x轴都设置为"其他国家" for country, cnt in stack_countries.items(): fig.add_trace(go.Bar( x = ["其他国家"], y = [cnt], name = country, hovertemplate = f"国家:{country}<br>数量:%{{y}}<extra></extra>" )) # 可选补充:如果要堆叠条总长度和第一名对齐,添加剩余未展示国家的条目 remaining_cnt = top_count - stack_countries.sum() if remaining_cnt > 0: fig.add_trace(go.Bar( x = ["其他国家"], y = [remaining_cnt], name = "其他更小国家", hovertemplate = f"国家:其他更小国家<br>数量:{remaining_cnt}<extra></extra>" )) # 配置布局 fig.update_layout( barmode = "stack", xaxis_title = "分类", yaxis_title = "数量", title = "国家分布统计" ) fig.show()
效果说明
运行代码后会得到符合你要求的图表:
- X轴有两个条形,第一个是第一名国家的独立条形,第二个是其他国家组成的堆叠条形
- 堆叠条形的每一段对应不同国家、展示不同颜色,悬停时可查看对应国家的具体数值
- 开启补充的对齐逻辑后,堆叠条总长度会和第一名的条形长度一致,更方便对比占比
内容的提问来源于stack exchange,提问作者rmd_po
相关产品推荐
相关产品推荐

