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

Matplotlib实现X轴含重复步骤的图表绘制问题

Matplotlib实现X轴含重复步骤的图表绘制问题

嗨,我来帮你搞定这个Matplotlib绘图的问题~

从你的描述和手绘草图来看,核心需求就是把按Parm_1分组、每组内Parm_2固定循环100-400的数据,用X轴清晰展示这种“大分组+重复子项”的结构对吧?其实只要给每个数据点分配连续的X轴位置,再自定义刻度标签就能实现,下面我给你一步步拆解实现方法:

思路核心

我们可以把每个Parm_1的组当成一个“块”,每个块里包含4个Parm_2的子项,给每个子项分配连续的X坐标(块之间可以留空隙增强区分度),然后用Matplotlib的自定义刻度功能,把Parm_1作为大组标签、Parm_2作为子项标签贴到X轴上,完美匹配你的手绘需求。

具体代码实现

我直接用你的数据结构写示例代码,你可以直接套用到自己的DataFrame上:

1. 先准备数据(模拟你的数据集)

import pandas as pd
import matplotlib.pyplot as plt

# 模拟你的DataFrame,补全了部分Result示例值
data = {
    'Parm_1': [100]*4 + [200]*4 + [300]*4,
    'Parm_2': [100, 200, 300, 400]*3,
    'Result': [0.2, 0.4, 0.9, 0.45, 0.01, 0.35, 0.7, 0.5, 0.12, 0.6, 0.8, 0.25]
}
df = pd.DataFrame(data)

2. 给每个数据点分配X轴位置

这里我给每个Parm_1组之间留了1个位置的空隙,让分组更清晰;如果不想留空隙,把gap设为0就行:

group_size = 4  # 每组固定4个Parm_2值
gap = 1         # 组之间的空隙大小

# 给每个数据点计算连续的X坐标
x_positions = []
for i, group in enumerate(df['Parm_1'].unique()):
    # 每组的起始X位置:组序号*(组内元素数+空隙)
    start = i * (group_size + gap)
    # 给当前组的4个元素分配连续位置
    x_positions.extend(range(start, start + group_size))
df['x_pos'] = x_positions

3. 绘制图表+自定义X轴刻度

这步是关键,我们把X轴分成主刻度(标注Parm_1分组)和次刻度(标注Parm_2子项),还可以加虚线分隔分组,完全贴合你的手绘效果:

plt.figure(figsize=(10, 6))

# 绘制折线+散点,让数据点更突出
plt.plot(df['x_pos'], df['Result'], marker='o', linestyle='-', color='#1f77b4', linewidth=2)

# 1. 设置主刻度:标注Parm_1的分组值,放在每组的中心位置
major_ticks = [i*(group_size + gap) + (group_size-1)/2 for i in range(len(df['Parm_1'].unique()))]
major_labels = [str(g) for g in df['Parm_1'].unique()]

# 2. 设置次刻度:标注每个Parm_2的子项值
minor_ticks = df['x_pos']
minor_labels = [str(p) for p in df['Parm_2']]

# 应用刻度设置
plt.gca().set_xticks(major_ticks)
plt.gca().set_xticklabels(major_labels, fontsize=12, weight='bold')
plt.gca().set_xticks(minor_ticks, minor=True)
plt.gca().set_xticklabels(minor_labels, minor=True, fontsize=10, rotation=45)

# 3. 加分组分隔虚线,视觉上更清晰
for group_start in [i*(group_size + gap) - 0.5 for i in range(len(df['Parm_1'].unique()))]:
    plt.axvline(x=group_start, color='gray', linestyle='--', alpha=0.5)

# 4. 完善标签和样式
plt.xlabel('分组(Parm_1) / 子项(Parm_2)', fontsize=12)
plt.ylabel('Result', fontsize=12)
plt.title('Result随Parm_1和Parm_2的变化趋势', fontsize=14)
plt.grid(axis='y', alpha=0.3)
plt.tight_layout()

plt.show()

额外优化选项

如果想让分组更直观,还可以把Parm_1的标签移到X轴上方(像你手绘的那样),只需要把主刻度标签的代码改成这样:

# 隐藏原来的主刻度标签
plt.gca().set_xticklabels([], minor=False)
# 把Parm_1标签画在每组的上方
for tick, label in zip(major_ticks, major_labels):
    plt.text(tick, plt.ylim()[1] + 0.03, label, ha='center', va='bottom', fontsize=12, weight='bold')

或者给不同的Parm_1组用不同颜色绘制,区分度更高:

# 按Parm_1分组,每组用不同颜色
colors = ['#1f77b4', '#2ca02c', '#ff7f0e']
for i, (group, g_df) in enumerate(df.groupby('Parm_1')):
    plt.plot(g_df['x_pos'], g_df['Result'], marker='o', linestyle='-', color=colors[i], 
             linewidth=2, label=f'Parm_1 = {group}')
plt.legend()

这样调整后,你的图表就会和手绘的效果完全一致啦,有任何细节想调整都可以随时改参数哦~

备注:内容来源于stack exchange,提问作者pb.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 18:42:59