Matplotlib: 一条线,绘制在两个不同单位的相关 x 轴上?

12 投票
2 回答
11073 浏览
提问于 2025-04-16 00:32

我有一个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)

撰写回答