Python 打印x和y次轴时缺少一个次标签

Python 打印x和y次轴时缺少一个次标签,python,matplotlib,plot,Python,Matplotlib,Plot,从这个问题开始,我学习了如何在同一个图上绘制两个x和y轴 这里有一个MWE: import matplotlib.pyplot as plt import numpy as np # Generate random data. x1 = np.random.randn(50) y1 = np.linspace(0, 1, 50) x2 = np.random.randn(20)+15. y2 = np.linspace(10, 20, 20) # Plot both curves.

从这个问题开始,我学习了如何在同一个图上绘制两个
x
y

这里有一个
MWE

import matplotlib.pyplot as plt
import numpy as np

# Generate random data.    
x1 = np.random.randn(50)
y1 = np.linspace(0, 1, 50)
x2 = np.random.randn(20)+15.
y2 = np.linspace(10, 20, 20)

# Plot both curves.
fig = plt.figure()

ax1 = fig.add_subplot(111)
ax1.set_xlabel('x_1')
ax1.set_ylabel('y_1')
plt.plot(x1, y1, c='r')

ax2 = ax1.twinx().twiny()
ax2.set_xlabel('x_2')
ax2.set_ylabel('y_2')
plt.ylim(min(y2), max(y2))
ax2.plot(x2, y2, c='b')

plt.show()
这是输出:

右侧
y
轴和顶部
x
轴对应蓝色曲线

如您所见,第二个
y
标签丢失,即使它已定义。我尝试了许多不同的方法,但我无法表现出来。我做错什么了吗


加:

很明显,线路有问题:

ax2 = ax1.twinx().twiny()
如果我这样颠倒它:

ax2 = ax1.twiny().twinx()

然后是第二个
x
标签将不会显示。

基本上,所发生的事情是创建了第三个轴对象,而您当前没有保留对该对象的引用<代码>ax2的可见y轴实际上属于第三个轴对象

你有两个选择

  • 保留对“隐藏”轴对象的引用并设置其y标签
  • 不要使用
    twinx
    twiny
    而是在与第一个轴相同的位置创建轴
  • 第二个选项更为详细,但有一个优点,即第二个绘图上的y轴限制将按预期自动缩放。您不需要像当前那样手动设置它们

    无论如何,这里有一个第一种选择的例子:

    import matplotlib.pyplot as plt
    import numpy as np
    
    # Generate random data.
    x1 = np.random.randn(50)
    y1 = np.linspace(0, 1, 50)
    x2 = np.random.randn(20)+15.
    y2 = np.linspace(10, 20, 20)
    
    # Plot both curves.
    fig, ax1 = plt.subplots()
    
    ax1.set(xlabel='x_1', ylabel='y_1')
    ax1.plot(x1, y1, c='r')
    
    tempax = ax1.twinx()
    ax2 = tempax.twiny()
    ax2.plot(x2, y2, c='b')
    ax2.set(xlabel='x_2', ylim=[min(y2), max(y2)])
    tempax.set_ylabel('y_2', rotation=-90)
    
    plt.show()
    
    …下面是第二个选项的示例:

    import matplotlib.pyplot as plt
    import numpy as np
    
    def twinboth(ax):
        # Alternately, we could do `newax = ax._make_twin_axes(frameon=False)`
        newax = ax.figure.add_subplot(ax.get_subplotspec(), frameon=False)
        newax.xaxis.set(label_position='top')
        newax.yaxis.set(label_position='right', offset_position='right')
        newax.yaxis.get_label().set_rotation(-90) # Optional...
        newax.yaxis.tick_right()
        newax.xaxis.tick_top()
        return newax
    
    # Generate random data.
    x1 = np.random.randn(50)
    y1 = np.linspace(0, 1, 50)
    x2 = np.random.randn(20)+15.
    y2 = np.linspace(10, 20, 20)
    
    # Plot both curves.
    fig, ax1 = plt.subplots()
    
    ax1.set(xlabel='x_1', ylabel='y_1')
    ax1.plot(x1, y1, c='r')
    
    ax2 = twinboth(ax1)
    ax2.set(xlabel='x_2', ylabel='y_2')
    ax2.plot(x2, y2, c='b')
    
    plt.show()
    
    两者产生相同的输出:


    发生的事情是,实际上创建了第三个轴。如果有机会,我稍后会添加一个完整的示例,但请尝试执行
    tempax=ax1.twinx();ax2=tempax.twny()
    然后将标签设置为
    tempax
    。还有另一种方法(在同一位置添加第二个轴)可以避免创建第三个轴,但它稍微复杂一些。