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

Matplotlib新手求助:如何设置多层X轴标签?

实现Matplotlib多层X轴标签

我是Matplotlib新手,希望实现多层X轴标签效果。现有如下Python代码绘制折线图,当前X轴仅显示一层标签(anna、adams、jane),想要改成多层X轴标签(双层结构,上层为学生名,下层对应每个学生的细分数据标签),请问该如何实现?

现有代码:

import matplotlib.pyplot as plt

data = {
    "midterm": {"anna": [2,8,6], "adams": [5,10,8], "jane":[4,10,8]},
    "final": {"anna": [3,7,5], "adams": [6,8,7], "jane":[2,8,7]}
}

for key in data.keys():
    y = data[key]["anna"] + data[key]["adams"]+data[key]["jane"]
    plt.plot(y, label=key)

x_location = [1,4,7]
x_labels = ["anna", "adams", "jane"]
plt.xticks(x_location, x_labels)
plt.legend()
plt.show()

解决方案

要实现双层X轴标签,可通过Matplotlib的twinx()创建共享Y轴的上层坐标轴,配合刻度位置对齐来完成,修改后的代码如下:

import matplotlib.pyplot as plt

data = {
    "midterm": {"anna": [2,8,6], "adams": [5,10,8], "jane":[4,10,8]},
    "final": {"anna": [3,7,5], "adams": [6,8,7], "jane":[2,8,7]}
}

# 绘制两条折线
for exam_type, scores in data.items():
    # 拼接所有学生的分数数据
    y_data = []
    for student_scores in scores.values():
        y_data.extend(student_scores)
    plt.plot(y_data, label=exam_type)

# ---------------------- 底层X轴(细分标签) ----------------------
# 每个学生对应3个数据点,生成底层刻度位置和标签
sub_ticks = []
sub_labels = []
current_pos = 0.5  # 初始偏移让刻度居中
for _ in range(len(data["midterm"]) * 3):
    sub_ticks.append(current_pos)
    sub_labels.append(f"Test {(_ % 3) + 1}")
    current_pos += 1

plt.xticks(sub_ticks, sub_labels, fontsize=10)
plt.xlabel("测试场次", fontsize=11)

# ---------------------- 上层X轴(学生名称) ----------------------
# 创建共享Y轴的新X轴
ax_upper = plt.gca().twiny()
# 上层刻度对应每个学生3个数据点的中间位置
upper_ticks = [1.5, 4.5, 7.5]
upper_labels = list(data["midterm"].keys())
ax_upper.set_xticks(upper_ticks)
ax_upper.set_xticklabels(upper_labels, fontsize=12, fontweight="bold")
ax_upper.set_xlabel("学生", fontsize=11)

# 调整上层轴的位置,避免和底层标签重叠
ax_upper.spines["top"].set_position(("outward", 25))

plt.legend()
plt.tight_layout()
plt.show()

关键步骤说明

  • 底层坐标轴:为每个数据点设置细分标签(如Test 1/2/3),刻度位置偏移0.5确保与折线数据点对齐
  • 上层坐标轴:通过twinx()创建新X轴,将刻度位置设置为每个学生3个数据点的中间值,保证学生名字标签居中对应
  • 布局优化:spines["top"].set_position调整上层轴的垂直位置,tight_layout()自动适配标签间距,防止内容截断

内容的提问来源于stack exchange,提问作者sikalo7064

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:45:06