【问题标题】:Plot single data with two Y axes (two units) in matplotlib在 matplotlib 中用两个 Y 轴(两个单位)绘制单个数据
【发布时间】:2015-09-18 23:47:49
【问题描述】:

我正在尝试绘制单个时间序列,但想在左右轴上以两个单位表示它。这是我到目前为止所做的。

fig, ax1 = plt.subplots()
t = np.arange(1,50,1)
s1 = np.sin(t)*20000+40000 #synthetic ts, but closer to my data 
ax1.plot(t, s1, 'b-')

ax1.set_xlabel('time')
ax1.set_ylim(20000,70000)
ax1.set_ylabel('km3/year')

km3yearToSv=31.6887646*(1/1e6)

ax2 = ax1.twinx()
s2 = s1*km3yearToSv
ax2.plot(t, s2, 'b-')
ax2.set_ylim(20000*km3yearToSv,70000*km3yearToSv)
ax2.set_ylabel('Sv')

通过调整 ylim(),我可以让它看起来像一行,但可以看到一些混叠。如果我不必将数据绘制两次,我会更喜欢。

有什么建议吗?

更新:谢谢,askewchan,提供完美的解决方案!

【问题讨论】:

  • 你能把你的整个脚本包括进来吗?

标签: python matplotlib plot


【解决方案1】:

没有必要绘制两次,这么多应该会给你想要的结果:

ax2 = ax1.twinx()
ax2.set_ylim(20000*km3yearToSv, 70000*km3yearToSv)
ax2.set_ylabel('Sv')

一种更可靠的方法是首先提取绘图的限制(如果您更改它们,它们不再是 2000070000,或者您希望绘图能够自动调整限制:

ax2 = ax1.twinx()
mn, mx = ax1.get_ylim()
ax2.set_ylim(mn*km3yearToSv, mx*km3yearToSv)
ax2.set_ylabel('Sv')

总的来说,还有一些其他的小调整:

import numpy as np
import matplotlib.pyplot as plt

mean, amp = 40000, 20000
t = np.arange(50)
s1 = np.sin(t)*amp + mean #synthetic ts, but closer to my data 

fig, ax1 = plt.subplots()
ax1.plot(t, s1, 'b-')

ax1.set_xlabel('time')
mn, mx = ax1.set_ylim(mean-amp, mean+amp)
ax1.set_ylabel('km$^3$/year')

km3yearToSv = 31.6887646e-6

ax2 = ax1.twinx()
ax2.set_ylim(mn*km3yearToSv, mx*km3yearToSv)
ax2.set_ylabel('Sv')

【讨论】:

  • 请注意,这仅适用于共享线性关系的单位
【解决方案2】:

上面代码中的一个小错误:

mn, mx = ax2.get_ylim()

应该是:

mn, mx = ax1.get_ylim()

在原始的基础上缩放新的辅助轴。

【讨论】:

    最近更新 更多