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

多层索引Pandas DataFrame绘制散点图的坐标轴配置问题

问题描述

需要基于多层行列索引的Pandas DataFrame绘制散点图,绘图规则:

  • x轴使用行索引第二层的百分比数值(20%、40%、60%、80%、90%、100%),覆盖P1、P2、P3三个一级索引分组
  • y轴使用列索引下S1、S2一级分组对应的ZCR二级列数据
    已可正常绘制同数据的折线图,但plt.scatter()无法直接读取多层索引结构生成符合预期的图。

测试用DataFrame构造代码如下:

import pandas as pd
import numpy as np

idx = pd.MultiIndex(
    levels=[['P1', 'P2', 'P3'], 
            ['20%', '40%', '60%', '80%', '90%', '100%']], 
    codes=[[0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2], 
           [0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5,]])

cols = pd.MultiIndex(levels=[['S1', 'S2'], 
                             ['MF', 'FSD', 'RMS', 'PPF', 'NPF', 'pk-pk', 'CF', 'ZCR', 'MZCI', 'ZCISD']], 
                     codes=[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 
                            [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])

df = pd.DataFrame(np.random.rand(18, 20),
                 columns = cols,
                 index = idx)

已验证可用的折线图绘制代码:

import matplotlib.pyplot as plt
df.loc[:, (slice(None), 'ZCR')].unstack(level=0).plot()
plt.show()
实现方案

pandas默认的plot()折线图方法会自动识别行索引作为x轴输入,但plt.scatter()要求显式传入一维结构的x、y值,不能直接接收带多层索引的DataFrame,核心处理逻辑是先把目标ZCR数据整理为扁平结构,再映射x轴的百分比值即可。
完整可运行代码:

# 提取所有ZCR列,将P1/P2/P3一级行索引转为列,保留百分比作为行索引
zcr_subset = df.loc[:, (slice(None), 'ZCR')].unstack(level=0)
# 简化多层列名,生成S1_P1、S1_P2...这类易读的分组名
zcr_subset.columns = [f"{s_group}_{p_group}" for s_group, p_group in zcr_subset.columns.droplevel(1)]
x_values = zcr_subset.index  # 直接取百分比索引作为x轴输入

# 逐分组绘制散点,和原有折线图的分组、配色逻辑保持一致
for col_name in zcr_subset.columns:
    plt.scatter(x_values, zcr_subset[col_name], label=col_name)

plt.ylabel("ZCR value")
plt.legend()
plt.show()
可选调整

如果不需要区分S、P维度的分组,要把所有ZCR点绘制为同一系列,直接把所有数据展平为一维数组即可:

x_all = np.repeat(zcr_subset.index, zcr_subset.shape[1])
y_all = zcr_subset.values.flatten()
plt.scatter(x_all, y_all)
plt.show()

内容的提问来源于stack exchange,提问作者Clément Chéry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 18:33:34