matplotlib:如何获取现有 twinx() 轴的句柄?

问题描述 投票:0回答:3

我想创建一个具有两个 y 轴的图形,并在代码中的不同点(来自不同的函数)向每个轴添加多条曲线。

在第一个函数中,我创建了一个图形:

   import matplotlib.pyplot as plt
   from numpy import *

   # Opens new figure with two axes
   def function1():
          f = plt.figure(1)
          ax1 = plt.subplot(211)
          ax2 = ax1.twinx()  

          x = linspace(0,2*pi,100)
          ax1.plot(x,sin(x),'b')
          ax2.plot(x,1000*cos(x),'g')

   # other stuff will be shown in subplot 212...

现在,在第二个函数中,我想向每个已创建的轴添加一条曲线:

   def function2():
          # Get handles of figure, which is already open
          f = plt.figure(1)
          ax3 = plt.subplot(211).axes  # get handle to 1st axis
          ax4 = ax3.twinx()            # get handle to 2nd axis (wrong?)

          # Add new curves
          x = linspace(0,2*pi,100)
          ax3.plot(x,sin(2*x),'m')
          ax4.plot(x,1000*cos(2*x),'r')

现在我的问题是,在执行第二个代码块后,第一个代码块中添加的绿色曲线不再可见(所有其他代码块都是)。

我认为原因是这条线

    ax4 = ax3.twinx()

在我的第二个代码块中。它可能会创建一个新的 twinx(),而不是返回现有句柄。

如何正确获取绘图中现有双轴的句柄?

python matplotlib plot
3个回答
5
投票

您可以使用 get_shared_x_axes (get_shared_y_axes) 来获取 twinx (twiny) 创建的轴的句柄:

# creat some axes
f,a = plt.subplots()

# create axes that share their x-axes
atwin = a.twinx()

# in case you don't have access to atwin anymore you can get a handle to it with
atwin_alt = a.get_shared_x_axes().get_siblings(a)[0]

atwin == atwin_alt # should be True

0
投票

我猜最干净的方法是在函数外部创建轴。然后你可以为函数提供你喜欢的任何轴。

import matplotlib.pyplot as plt
import numpy as np

def function1(ax1, ax2):
    x = np.linspace(0,2*np.pi,100)
    ax1.plot(x,np.sin(x),'b')
    ax2.plot(x,1000*np.cos(x),'g')

def function2(ax1, ax2):
    x = np.linspace(0,2*np.pi,100)
    ax1.plot(x,np.sin(2*x),'m')
    ax2.plot(x,1000*np.cos(2*x),'r')

fig, (ax, bx) = plt.subplots(nrows=2)
axtwin = ax.twinx()

function1(ax, axtwin)
function2(ax, axtwin)

plt.show()

0
投票

我针对略有不同的情况想出了一个解决方案。我的绘图代码被包装到一个函数中。这种函数的一个最小示例是:

def myplot(ax, data):
    ax.plot(data['left'], color='C0')
    ax.twinx().plot(data['right'], color='C1')

myplot(ax, {'left': [0, 1, 2, 3], 'right': [3, 2, 1, 0]})

这是一个修改版本,存储第二个 y 轴的引用:

def myplot_persistent(ax, data):
    if 'twinx' in ax.__dict__.keys():
        ax_right = ax.__dict__['twinx']
    else:
        ax_right = ax.twinx()
        ax.__dict__['twinx'] = ax_right

    ax.plot(data['left'], color='C0')
    ax_right.plot(data['right'], color='C1')

(_, ax) = plt.subplots(1, 1)
myplot_persistent(ax, {'left': [0, 1, 2, 3], 'right': [3, 2, 1, 0]})
myplot_persistent(ax, {'left': [1, 2, 3], 'right': [2, 1, 0]})
© www.soinside.com 2019 - 2024. All rights reserved.