【问题标题】:Two y axes for a single plot单个图的两个 y 轴
【发布时间】:2016-08-17 15:05:37
【问题描述】:

我正在尝试为相同的数据创建一个带有两个 Y 轴(左和右)的图,也就是说,一个是另一个的缩放版本。我还想保留刻度位置和网格位置,因此网格将匹配两侧的刻度。

我试图通过绘制两次相同的数据来做到这一点,一个按原样,另一个按比例缩放,但它们并不重合。

import numpy as np
import matplotlib.pyplot as plt
x = np.arange(17, 27, 0.1)
y1 = 0.05 * x + 100

fig, ax1 = plt.subplots()

ax2 = ax1.twinx()
ax1.plot(x, y1, 'g-')
ax2.plot(x, y1/max(y1), 'g-')

ax1.set_xlabel('X data')
ax1.set_ylabel('Y data', color='g')
ax2.set_ylabel('Y data normalized', color='b')

plt.grid()
plt.show()

我们将不胜感激。

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    不确定是否可以在标准化轴上不出现丑陋数字的情况下实现这一目标。但是,如果这不打扰您,请尝试将其添加到您的代码中:

    ax2.set_ylim([ax1.get_ylim()[0]/max(y1),ax1.get_ylim()[1]/max(y1)])
    ax2.set_yticks(ax1.get_yticks()/max(y1))
    

    可能不是最优雅的解决方案,但它可以缩放您的轴限制和刻度位置,类似于您对数据本身所做的操作,因此网格与两个轴匹配。

    【讨论】:

    • 谢谢。这可以解决问题。我不希望两个轴都有完整的数字,是的,但是右轴将是百分比,所以我会相应地格式化它们。
    • 打开网格选项可能有助于给人以相同刻度的印象。
    • 我尝试了另一个数据集,但它不起作用。只需使用 'y1=0.05*x+100' 将绘制两个不同的比例,并显示两个图。
    • 是的,当ax1 的所有 yticks 并非都在轴范围内时,似乎就是这种情况。尝试再添加一行:ax1.set_ylim([min(ax1.get_yticks()),max(ax1.get_yticks())])
    猜你喜欢
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多