使用Python绘制Marimekko图表时堆叠失效问题求助
修复Plotly Marimekko图表条形重叠问题
你的代码出现条形重叠的核心原因有两个:
- x轴设置错误:每个trace的x都使用了所有genre的起始位置数组,导致所有artist的bar在同一组x坐标上完全重合;
- 未做归一化处理:原始y值是绝对数值,Marimekko图表要求每个genre(竖条)内的子类别堆叠后高度为100%,这样才能体现各artist在对应genre中的占比关系。
另外还有个小问题:fig.show缺少括号,应该写成fig.show()才能正确渲染图表。
修复后的完整代码
import plotly.graph_objects as go import numpy as np artist1 = [22.99, 29.77, 32.75, 31.62, 33.52] artist2 = [21.59, 23.51, 28.62, 21.9, 26.96] artist3 = [19.82, 17.83, 13.79, 19.7, 18.6] artist4 = [18.0, 17.01, 12.87, 14.57, 12.6] artist5 = [17.6, 11.87, 11.98, 12.21, 8.32] genre_list = ['Pop', 'R&B/Hip Hop', 'Dance/Electronic', 'Rock', 'Latin'] genre_proportion = [40.96, 23.61, 18.53, 13.43, 3.47] # 计算每个genre的总数值,用于归一化 genre_totals = np.array([sum(vals) for vals in zip(artist5, artist4, artist3, artist2, artist1)]) data = { "Artist 5": artist5, "Artist 4": artist4, "Artist 3": artist3, "Artist 2": artist2, "Artist 1": artist1 } # 归一化每个artist的数值为百分比(每个genre内总和为100%) normalized_data = {} for name, values in data.items(): normalized_data[name] = (np.array(values) / genre_totals) * 100 fig = go.Figure() for name, vals in normalized_data.items(): fig.add_trace( go.Bar( name=name, y=vals, x=genre_list, # 设置每个genre的宽度对应其占比 width=np.array(genre_proportion) / 100 * 0.8, offset=0 ) ) fig.update_layout( title_text="Marimekko Chart", barmode="stack", yaxis_title="Percentage", xaxis_title="Genre" ) # 正确调用show方法 fig.show()
关键修复点说明
- 数据归一化:将每个artist的数值转换为对应genre内的百分比,确保每个genre的竖条堆叠后高度统一为100%,符合Marimekko图表的展示逻辑;
- x轴设置:直接使用
genre_list作为x轴类别,每个trace在对应genre位置绘制bar,配合barmode="stack"实现堆叠效果; - 宽度调整:将
genre_proportion转换为相对宽度(除以100后乘以0.8避免溢出),让每个genre的竖条宽度对应其市场占比。
内容的提问来源于stack exchange,提问作者honn
相关产品推荐
相关产品推荐

