使用Matplotlib绘制共享x轴图形

3

我是一个 matplotlib 的初学者,我期望的结果如下:

  1. 两个坐标轴共享 x 轴
  2. 两个 y 轴分别在坐标轴的两端
  3. 当我改变图形大小时,x 轴和 y 轴的比例为 1:1
  4. 有图例

我试着编写代码以满足这些要求,尝试使用 twinx() 和 set_aspect('equal'),但似乎不行。以下是我的测试代码。我不知道如何设置参数才能得到以下结果:

  • 通过鼠标更改图形大小时,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轴和y轴显示长度的比例,无论我如何改变窗口大小,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轴从0到20运行,而y轴0-1或从0-1e6运行? - Quang Hoang
谢谢你的帮助,很抱歉我的描述不够清晰。你是对的,实际上一个图中有两个轴,我希望让x轴和两个y轴的刻度尺相等,x轴被两个轴共享,两个y轴具有不同的主要刻度尺和次要刻度尺(例如0、1、2、3和0、10000、20000...),在一个图中,x轴与y轴具有相同的长度(如果轴是正方形的,当我将图形从正方形移动到矩形时,轴也是正方形)。你知道怎么做吗? - irreallich
嗨@Quang:感谢您想要在这里编辑问题。我能麻烦您不要使用代码格式来制作有序列表吗?使用标准的<ol>格式更好,当然这些内容并不是代码。 - halfer
1个回答

1
一个相等的纵横比并不是您想要的,因为这意味着x轴上的一个单位在图中的长度与y轴上的一个单位相同。例如,您的y2轴的长度将必须大约是x轴的40,000倍(即800,000 / 20)。此外,在同一图中为两个y轴设置相等的纵横比是不可能的,除非它们都覆盖相同数量的单位。
如果您需要正方形的图形,只需将图形大小设置为两个相等的数字,例如:
fig = plt.figure(figsize=[8, 8])

无论你的代码是什么,当你通过鼠标“改变图形大小”时,所发生的情况将取决于你使用的程序。

Arne,非常感谢!由于评论长度的限制,我将评论作为新答案添加以解释“通过鼠标更改图像大小”,实际上应该是“在win10中通过鼠标更改窗口大小”,并且我添加了一个临时代码来显示它。 - irreallich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接