多层索引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
相关产品推荐
相关产品推荐

