我试图绘制单个时间序列,但想要在左右轴上以两个单位表示它。这是我到目前为止所做的。
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,完美的解决方案!
答案 0 :(得分:8)
没有必要将它绘制两次,这应该会给你想要的结果:
ax2 = ax1.twinx()
ax2.set_ylim(20000*km3yearToSv, 70000*km3yearToSv)
ax2.set_ylabel('Sv')
更强大的方法是首先提取绘图的限制(如果您更改它们,并且它们不再是20000
和70000
,或者您想要绘图能够自动调整限制:
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')
答案 1 :(得分:1)
上面的代码中有一个小错误:
mn, mx = ax2.get_ylim()
应为:
mn, mx = ax1.get_ylim()
根据原始比例缩放新的辅助轴。