You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python绘制Marimekko图表时堆叠失效问题求助

修复Plotly Marimekko图表条形重叠问题

你的代码出现条形重叠的核心原因有两个:

  1. x轴设置错误:每个trace的x都使用了所有genre的起始位置数组,导致所有artist的bar在同一组x坐标上完全重合;
  2. 未做归一化处理:原始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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 18:16:31