Matplotlib: 一条线,绘制在两个不同单位的相关 x 轴上?
我有一个y变量,想把它和两个相关的x轴一起画出来,一个在图的上面,一个在下面(比如说,y是“立方体里的东西数量”,x1是“立方体的边长”,x2是“立方体的体积”)。我把y、x1和x2都放在了numpy数组里。x1和x2之间的关系是一对一的,并且是单调的,但不是简单的,它们的变化方向不同,比如“边长”和“体积的倒数”。我试过用twiny()和twin(),但这些似乎是用来画不同的y变量的。有没有什么好主意?谢谢大家!
下面是我想做的那种图的例子,不过我想用一条线来表示,而不是符号。我的想法是,比如说,sigma=0.4和M=2e15是同一个点的等价和可互换的标签。
alt text http://img580.imageshack.us/img580/4554/screenshotuy.png
2 个回答
2
为了完整性,
存在一种叫“次坐标轴”的东西(matplotlib 文档):
ax.secondary_xaxis('top', functions=(to_new_axis, from_new_axis))
这两个函数
to_new_axis(), from_new_axis()
需要在你的当前单位和不同单位之间进行适当的缩放。
文档中的代码:
fig, ax = plt.subplots(constrained_layout=True)
x = np.arange(0, 360, 1)
y = np.sin(2 * x * np.pi / 180)
ax.plot(x, y)
ax.set_xlabel('angle [degrees]')
ax.set_ylabel('signal')
ax.set_title('Sine wave')
def deg2rad(x):
return x * np.pi / 180
def rad2deg(x):
return x * 180 / np.pi
secax = ax.secondary_xaxis('top', functions=(deg2rad, rad2deg))
secax.set_xlabel('angle [rad]')
plt.show()
这里,他们展示了正弦函数,单位是度和弧度。
如果你没有明确的函数来在不同的刻度之间转换,你可以使用 numpy 的插值功能:
def forward(x):
return np.interp(x, xold, xnew)
def inverse(x):
return np.interp(x, xnew, xold)
8
对于不同的x轴比例,可以使用 twiny()
这个函数(可以把它理解为“共享y轴”)。下面是一个稍微改编过的例子,来自于 matplotlib的文档:
import numpy as np
import matplotlib.pyplot as plt
# plot f(x)=x for two different x ranges
x1 = np.linspace(0, 1, 50)
x2 = np.linspace(0, 2, 50)
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.plot(x1, x1,'b--')
ax2 = ax1.twiny()
ax2.plot(x2, x2, 'go')
plt.show()
如果你只是想要一个第二个轴,可以把第二组数据画成不可见的。
ax2.plot(x2, x2, alpha=0)