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
相关产品推荐
相关产品推荐

