3

我正在开发一个功能,该功能可以让我轻松地在绘图上的任何位置添加寄生轴,但我遇到了一个奇怪的情况。看看下面的代码:

import matplotlib.pyplot as plt

plt.plot()
plt.gca().set_position([1/3, 1/3, 1/3, 1/3])
plt.gca().twinx()

plt.show()

上面的代码产生下图: 在此处输入图像描述

如您所见,孪生图是使用宿主图的旧位置生成的。我本来希望在主机图的新位置上生成 twinx 图。

如何在宿主图的新位置上绘制 twinx 图?(我知道事先绘制 twinx 图“解决”了这个问题,但这不是一个实际的解决方案

谢谢你的帮助!

4

2 回答 2

2

我想出了一种通过反复试验来解决问题的方法。但是,应该注意的是,我不知道它是如何twinx工作的,而且我是 matplotlib 的初学者,所以我绝对无法理解正在发生的任何事情。

我为解决这个问题所做的是我plt.gcf().subplots_adjust()在创建 twinx 之前使用的。但是,这样做会有效地破坏新位置,因此我事先保存了它们以便能够在创建twinx. 代码变为:

import matplotlib.pyplot as plt

plt.plot()
plt.gca().set_position([1/3, 1/3, 1/3, 1/3])
pos = plt.gca().get_position()     #added line
plt.gcf().subplots_adjust()        #added line
plt.gca().twinx()
plt.gca().set_position(pos)        #added line

plt.show()

但是,我仍然愿意阅读一些比我更好的答案,所以请随时提出您的建议!

注意:上面的代码看起来很愚蠢(我设置位置只是为了重置它,然后再重新应用它),但在我的实际应用程序中,第一个set_position将由较早的函数调用执行,而稍后的函数调用需要添加twinx, 所以这确实有一个用例。

于 2020-07-01T02:40:58.260 回答
0

您可以在调用后设置轴twinx的位置,使用之前初始设置的位置数据twinx

有几种方法可以做到这一点。

import matplotlib.pyplot as plt

# Create original plot
plt.plot()
ax = plt.gca()
ax.set_position([1/3,1/3,1/3,1/3])
# Make twin axes.
ax2 = ax.twinx()
ax2.set_position(ax.get_position())

plt.show()

或者,您可以执行ax.set_position(ax.get_position()). 但是一个关键点是将原始 Axes 记录到一个变量中,因为gca一旦你调用它就指向新的 Axes (位置错误)twinx

如果您不想将轴存储在变量中,则可以将轴位置存储在变量中。

import matplotlib.pyplot as plt

# Create original plot
plt.plot()
plt.gca().set_position([1/3, 1/3, 1/3, 1/3])
# Make twin axes
pos = plt.gca().get_position()
plt.gca().twinx()
plt.gca().set_position(pos)

plt.show()

不需要丢弃之前设置的位置。

于 2021-10-21T02:21:41.457 回答