Python 在matplotlib中,如何使用与主轴一起输入到函数的次轴?

Python 在matplotlib中,如何使用与主轴一起输入到函数的次轴?,python,matplotlib,Python,Matplotlib,我有一个带有两个参数的函数(x1,x2)。我想在y轴上绘制函数结果,在x轴上绘制函数结果,x1,在右y轴(次轴)上绘制函数结果 我的问题是x1和x2轴的值与功能点不一致 例如: 我希望在主y轴上读取的值与其他两个轴的x1和x2输入相匹配 代码: x1 = np.linspace(0, 10, 10) x2 = np.linspace(0, 5, 10) f = lambda x1, x2: np.exp(-x1) / 10 + np.exp(-x2) / 10 resp = [] for

我有一个带有两个参数的函数(
x1
x2
)。我想在y轴上绘制函数结果,在x轴上绘制函数结果,
x1
,在右y轴(次轴)上绘制函数结果

我的问题是
x1
x2
轴的值与功能点不一致

例如:

我希望在主y轴上读取的值与其他两个轴的
x1
x2
输入相匹配

代码:

x1 = np.linspace(0, 10, 10)
x2 = np.linspace(0, 5, 10)

f = lambda x1, x2: np.exp(-x1) / 10 + np.exp(-x2) / 10

resp = []
for i, j in zip(x1, x2):
    resp.append(f(i, j))
resp = np.array(resp)

fig, ax1 = plt.subplots()
ax2 = ax1.twinx()

ax1.plot(x1, resp)

ax1.set_xlabel('(x1)')
ax1.grid(True)
ax1.set_ylabel('(y)')

ax2.set_ylabel('(x2)')
ax2.set_yticks(x2)

plt.xticks(np.arange(min(x1), max(x1)))

plt.show()

如果您的输入参数处于lockstep中,则您没有两个参数的函数。两个参数的函数有两个独立的输入。您的输入是依赖的,因此您没有编写
f(x1,x2)
,而是编写
f(x,g(x))
,这就是
f'(x)
。在您有
x1=np.linspace(0,10,10)
的特定示例中。您可以只编写
x2=0.5*x1
,而不是编写
x2=np.linspace(0,5,10)
。你的指数可以写成

x = np.linspace(0, 10, 10)
y = np.exp(-x) / 10 + np.exp(-x / 2) / 10
请注意,您不需要函数定义或循环来计算
y
值。使用循环违背了使用numpy的全部目的。您原来的五行可以用同样的方法缩减为
y=np.exp(-x1)/10+np.exp(-x2)/10

现在,如果您想在
y
vs
x
的绘图中查看次要
x
值,您可以采取以下措施:

fig, ax1 = plt.subplots()
ax1.plot(x, y)
ax1.set_xlabel('(x1)')
ax1.grid(True)
ax1.set_ylabel('(y)')

ax2 = ax1.secondary_xaxis('top', functions=(lambda x: x / 2, lambda x: 2 * x))
ax2.set_xlabel('(x2)')
plt.show()
结果显示lockstep中的“两个”输入:

现在如果你真的想要一个两个变量的函数,那么任何输入的组合都会产生一个有效的
y
值。在本例中,您必须使用名为的numpy功能,该功能通过将数组维度排列在右侧来匹配它们

假设您将其中一个输入定义为转置:

x1 = np.linspace(0, 10, 10)                # Shape   (10,)
x2 = np.linspace(0, 5, 10).reshape(-1, 1)  # Shape (10, 1)
对这些值进行操作的结果将是一个
(10,10)
2D数组。现在,您可以有意义地将
y
计算为两个自变量的函数:

y = np.exp(-x1) / 10 + np.exp(-x2) / 10
要绘制这样一个阵列,您需要两个x轴和一个y轴,换句话说,一个3D打印。以下是在matplotlib中显示类似内容的一种方法:

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm

fig, ax = plt.subplots(subplot_kw={'projection': '3d'})
s = ax.plot_surface(x1, x2, y, cm=cm.jet)
ax.set_xlabel('(x1)')
ax.set_ylabel('(x2)')
ax.set_zlabel('(y)')
fig.colorbar(s)
以下是结果图:


取决于您想要函数的哪个表示形式。

如果您的输入参数处于锁定状态,则您没有两个参数的函数。两个参数的函数有两个独立的输入。您的输入是依赖的,因此您没有编写
f(x1,x2)
,而是编写
f(x,g(x))
,这就是
f'(x)
。在您有
x1=np.linspace(0,10,10)
的特定示例中。您可以只编写
x2=0.5*x1
,而不是编写
x2=np.linspace(0,5,10)
。你的指数可以写成

x = np.linspace(0, 10, 10)
y = np.exp(-x) / 10 + np.exp(-x / 2) / 10
请注意,您不需要函数定义或循环来计算
y
值。使用循环违背了使用numpy的全部目的。您原来的五行可以用同样的方法缩减为
y=np.exp(-x1)/10+np.exp(-x2)/10

现在,如果您想在
y
vs
x
的绘图中查看次要
x
值,您可以采取以下措施:

fig, ax1 = plt.subplots()
ax1.plot(x, y)
ax1.set_xlabel('(x1)')
ax1.grid(True)
ax1.set_ylabel('(y)')

ax2 = ax1.secondary_xaxis('top', functions=(lambda x: x / 2, lambda x: 2 * x))
ax2.set_xlabel('(x2)')
plt.show()
结果显示lockstep中的“两个”输入:

现在如果你真的想要一个两个变量的函数,那么任何输入的组合都会产生一个有效的
y
值。在本例中,您必须使用名为的numpy功能,该功能通过将数组维度排列在右侧来匹配它们

假设您将其中一个输入定义为转置:

x1 = np.linspace(0, 10, 10)                # Shape   (10,)
x2 = np.linspace(0, 5, 10).reshape(-1, 1)  # Shape (10, 1)
对这些值进行操作的结果将是一个
(10,10)
2D数组。现在,您可以有意义地将
y
计算为两个自变量的函数:

y = np.exp(-x1) / 10 + np.exp(-x2) / 10
要绘制这样一个阵列,您需要两个x轴和一个y轴,换句话说,一个3D打印。以下是在matplotlib中显示类似内容的一种方法:

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm

fig, ax = plt.subplots(subplot_kw={'projection': '3d'})
s = ax.plot_surface(x1, x2, y, cm=cm.jet)
ax.set_xlabel('(x1)')
ax.set_ylabel('(x2)')
ax.set_zlabel('(y)')
fig.colorbar(s)
以下是结果图:


取决于您想要函数的哪种表示形式。

您需要一种3D表示形式,如热图、等高线图或曲面,即使我只想显示一条线?这条线不是两个参数的函数。看起来像,但实际上不是。你只需要
x
和一些
x
的缩放,你需要一个3D表示,比如热图、等高线图或曲面,即使我只想显示一条线?那条线不是两个参数的函数。看起来像,但实际上不是。您只需要
x
和一些
x
的缩放,谢谢。实际上,我的问题的这个函数只是一个例子(糟糕的选择),因为我原来的函数很长,我认为没有必要在这里包含它。原始函数确实包含独立变量。我使用了一个循环来确保我只有序列中成对的响应。@delavald。我的回答实际上涵盖了这两种情况。如果序列中有对,那么就没有两个变量的函数。不适用于您正在绘制的样本。您可以在3D中绘制一条线,即我显示的曲面的一部分,也可以作为
x1
的函数绘制
x2
。你是在问后者吗?是的。我想画一条线,但没有三维表示。但在二维表示中显示三个轴。我的第一个示例向您展示了如何做到这一点。你可以用你想要的任何东西来替换记号转换函数。有什么我可以改进或详述的吗?谢谢。实际上,我的问题的这个函数只是一个例子(糟糕的选择),因为我原来的函数很长,我认为没有必要在这里包含它。原始函数确实包含独立变量。我使用了一个循环来确保我只有r