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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 13:55:12