如何在Matplotlib单X轴显示双单位标题并绘制混合单位数据
解决方法
核心思路是先把所有x值统一为同一基准单位(比如全部转成分钟),再通过自定义刻度、分区标注和双轴标题来区分原有的两种单位。以下是具体实现方案:
步骤1:数据准备与单位统一
先将不同单位的x值转换为同一基准(示例统一为分钟),保证坐标轴数值连续:
import matplotlib.pyplot as plt import numpy as np # 模拟数据:前6个为分钟单位,后4个为小时单位 x_minutes = np.array([10, 20, 30, 40, 50, 60]) x_hours = np.array([1.5, 2, 2.5, 3]) y = np.random.randn(10) # 对应y值 # 统一为分钟单位 x_unified = np.concatenate([x_minutes, x_hours * 60]) split_idx = len(x_minutes) # 两种单位的分界位置 split_val = x_unified[split_idx - 1] # 分界数值(60分钟=1小时)
步骤2:绘制主图与分区标记
绘制曲线后,用竖线标记两种单位的分界区域:
fig, ax = plt.subplots(figsize=(10, 6)) ax.plot(x_unified, y, 'b-', marker='o') # 添加分界竖线,直观区分分钟/小时区域 ax.axvline(x=split_val, color='gray', linestyle='--', alpha=0.7)
步骤3:自定义刻度与双单位标题
为X轴添加对应原始单位的刻度标签,通过副轴实现双标题:
# 设置主刻度与自定义标签:前半段显示分钟,后半段显示小时 ax.set_xticks(x_unified) xtick_labels = [f'{val} min' for val in x_minutes] + [f'{val/60} h' for val in x_unified[split_idx:]] ax.set_xticklabels(xtick_labels, rotation=45, ha='right') # 主X轴标题(分钟) ax.set_xlabel('时间(分钟)', fontsize=12, labelpad=10) # 创建共享Y轴的副X轴,仅显示小时单位标题 ax2 = ax.twiny() ax2.set_xlim(ax.get_xlim()) ax2.set_xticks([]) # 隐藏副轴刻度,避免干扰 ax2.set_xlabel('时间(小时)', fontsize=12, labelpad=10) # 添加区域文本标注,强化单位区分 ax.text(split_val/2, ax.get_ylim()[1]*0.9, '分钟区域', ha='center', fontsize=10, bbox=dict(facecolor='white', alpha=0.8)) ax.text((split_val + x_unified[-1])/2, ax.get_ylim()[1]*0.9, '小时区域', ha='center', fontsize=10, bbox=dict(facecolor='white', alpha=0.8)) plt.tight_layout() plt.show()
关键细节说明
- 单位统一是核心:matplotlib坐标轴为连续数值轴,必须先将不同单位的x值转换为同一基准,才能正常绘图。
- 双标题通过
twiny()创建副轴实现,副轴仅保留标题,避免刻度重复。 - 自定义刻度标签直接对应原始单位,让读者直观识别不同区域的单位类型。
内容的提问来源于stack exchange,提问作者Paulo Gabriel Ferreira de Azev
相关产品推荐
相关产品推荐

