我有一个y变量,我试图在图的顶部和底部绘制两个相关的x轴(例如,y =“立方体中的数量”,x1 =“立方体的边长”, x2 =“立方体的体积”)。我在yumpy数组中有y,x1,x2。我的x1和x2之间的关系是一对一和单调的,但不是简单的,它们在不同的方向上增加,如“边长”和“反向体积”。我尝试过使用twiny()和twin(),但这些似乎是为了绘制不同的y变量而设计的。有任何想法吗?谢谢大家!
以下是我尝试做的事情的一个例子,除了一行而不是符号。这个想法是,例如,sigma = 0.4和M = 2e15是等价的,可互换的标签是一个点。
alt text http://img580.imageshack.us/img580/4554/screenshotuy.png
答案 0 :(得分:8)
对于不同的x-scale,使用twiny()
(将其视为“共享的y轴”)。一个稍微改编自matplotlib documentation的例子:
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)
答案 1 :(得分:0)
仅出于完整性考虑: 存在“辅助轴”(matplotlib docs):
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)