我是 matplotlab 的初学者。我的预期结果如下
- 两个轴共享x轴
- 两个y轴分别在axes的两端,
- 当我更改图形大小、x 轴和 y 轴比例为 1:1 时
- 有传说。
我尝试为需求编写代码,尝试将 twinx() 和 set_aspect 设置为“相等”,但这似乎是不可能的。以下是我的测试代码。我不知道如何设置参数以获得以下结果:
- 鼠标改变图形大小时,x轴和y轴1:1缩放
- y2标签在左轴的右边
我也试过twinx,但是无法设置“x轴和y轴比例1:1**”
import numpy as np
import matplotlib.pyplot as plt
x1 = np.arange(10)
x2 = np.arange(20)
y1 = x1*x1*10000
y2 = np.sin(x2)
#adjust = 'datalim'
adjust = 'box'
#asp = 'equal'
asp = 'auto'
fig = plt.figure()
ax1 = fig.add_subplot(111,aspect=asp)
ax2 = fig.add_subplot(111,aspect=asp,frameon=False,sharex=ax1)
ax1.set_adjustable(adjust)
ax1.set_xlabel("xxxxxxxx")
ax1.set_ylabel("y1")
ax1.plot(x1,y1,label='ax1')
ax2.set_adjustable(adjust)
ax2.get_yaxis().set_ticks_position('right')
ax2.set_ylabel("y2",color='tab:red')
ax2.plot(x2,y2,label='ax2',color='tab:red')
ax1.tick_params(axis='y', labelcolor='tab:blue')
ax1.tick_params(axis='y', labelcolor='tab:red')
ax1.legend(loc='upper left', bbox_to_anchor=(1, 0.5))
ax2.legend(loc='upper left', bbox_to_anchor=(1, 0.6))
plt.show()
关于“鼠标改变图形大小”:
如果在win10中将鼠标移动到应用程序窗口的边缘,可以使用鼠标调整窗口大小
当显示图形时,我们可以通过鼠标调整窗口大小,我想锁定x轴和x轴显示长度的比例,无论我如何改变窗口大小,x的显示长度- 轴和 y 轴始终相同。
下面的代码有一个x轴和一个y轴,它是用来显示预期结果的,但是里面只有一个x和一个y。
import numpy as np
import matplotlib.pyplot as plt
x1 = np.arange(10)
x2 = np.arange(20)
y1 = x1*x1*10000
y2 = np.sin(x2)
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.set_adjustable('box')
ax1.set_aspect('equal')
ax1.set_xlabel("xxxxxxxx")
ax1.set_ylabel("y1")
ax1.plot(x2*0.1,y2)
plt.show()
我希望在标准 Python IDE (IDLE) 中得到预期的结果。 然后我可以将代码移动到我的真实项目中。 在我的真实项目中,我创建了一个图形并将其移动到 wxpython 代码如下:
self.figure = Figure()
self.canvas = FigureCanvasWxAgg(self, -1, self.figure)
由于wxpython面板需要改变他的大小,所以图形会跟着改变。
一种方法是写一个函数来自动计算和改变图形的大小,但是很复杂,有没有别的方法呢?
最佳答案
等纵横比不是您想要的,因为这意味着 x 轴上的一个单位在图上的长度与 y 轴上的一个单位的长度相同。所以例如你的 y2 轴必须是你的 x 轴的大约 40,000(即 800,000/20)倍。最重要的是,同一图中的两个 y 轴不可能具有相等的纵横比,除非它们都覆盖相同数量的单位。
如果你需要一个方形图形,只需将图形大小设置为两个相等的数字,例如
fig = plt.figure(figsize=[8, 8])
无论您的代码如何,当您“通过鼠标更改图形大小”时会发生什么将取决于您使用的程序。
关于python - 使用 matplotlib 绘制 share-x 图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61903958/