如何在Python单图中绘制不同刻度多线并呈现小刻度曲线变化
解决单图多曲线刻度差异大的绘图问题
当单图里一条曲线数值范围远大于另一条时,小范围曲线的细节很容易被掩盖,给你几个实用的解决办法:
1. 用双Y轴分开刻度
这是最常用的方法,给两条曲线分别分配左右两个Y轴,各自匹配对应的刻度范围,两边的刻度互不干扰,两条曲线的细节都能清晰展示。
示例代码:
import matplotlib.pyplot as plt import numpy as np # 模拟测试数据 x = np.linspace(0, 10, 100) y_large = np.sin(x) * 1000 # 大范围曲线 y_small = np.cos(x) * 5 # 小范围曲线 fig, ax1 = plt.subplots() # 画大范围曲线,绑定左侧Y轴 color = 'tab:red' ax1.set_xlabel('X轴') ax1.set_ylabel('大范围数值', color=color) ax1.plot(x, y_large, color=color) ax1.tick_params(axis='y', labelcolor=color) # 创建右侧Y轴,画小范围曲线 ax2 = ax1.twinx() color = 'tab:blue' ax2.set_ylabel('小范围数值', color=color) ax2.plot(x, y_small, color=color) ax2.tick_params(axis='y', labelcolor=color) fig.tight_layout() plt.show()
2. 拆分成子图单独展示
把两条曲线分别放在上下或左右的子图里,每个子图用自己的刻度,完全避免互相干扰,细节展示最清楚。
示例代码:
import matplotlib.pyplot as plt import numpy as np x = np.linspace(0, 10, 100) y_large = np.sin(x) * 1000 y_small = np.cos(x) * 5 # 生成上下排列的子图,共享X轴 fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True, figsize=(8, 6)) # 上子图放大范围曲线 ax1.plot(x, y_large, color='tab:red') ax1.set_ylabel('大范围数值') # 下子图放小范围曲线 ax2.plot(x, y_small, color='tab:blue') ax2.set_xlabel('X轴') ax2.set_ylabel('小范围数值') plt.tight_layout() plt.show()
3. 改用对数坐标轴(适合量级差极大的场景)
如果两条曲线的数值量级差了好几个数量级(比如一个是几百,一个是0.001),把Y轴改成对数刻度,能同时容纳大小范围的数值,细节也能体现出来。
示例代码:
import matplotlib.pyplot as plt import numpy as np x = np.linspace(1, 10, 100) y_large = np.exp(x) # 指数级增长的大范围数据 y_small = np.log(x) # 小范围数据 plt.plot(x, y_large, label='大范围曲线') plt.plot(x, y_small, label='小范围曲线') plt.yscale('log') # 设置Y轴为对数刻度 plt.xlabel('X轴') plt.ylabel('数值(对数刻度)') plt.legend() plt.show()
4. 给小范围曲线加偏移量(适合不想改轴的情况)
如果不想用双Y轴或子图,可以给小范围曲线加一个固定偏移量,让它在同一轴上和大曲线分开,同时标注清楚实际数值范围。
示例代码:
import matplotlib.pyplot as plt import numpy as np x = np.linspace(0, 10, 100) y_large = np.sin(x) * 1000 y_small = np.cos(x) * 5 offset = 200 # 偏移量,让小曲线在大曲线下方展示 y_small_shifted = y_small + offset plt.plot(x, y_large, label='大范围曲线') plt.plot(x, y_small_shifted, label='小范围曲线(偏移+200)') plt.xlabel('X轴') plt.ylabel('数值') plt.legend() # 手动标注小曲线的实际数值范围 plt.text(8, offset+3, '实际范围:-5~5', fontsize=10) plt.show()
内容的提问来源于stack exchange,提问作者Havva Mehralitabar
相关产品推荐
相关产品推荐

