【问题标题】:same scale of Y axis on differents figures不同图形上的 Y 轴比例相同
【发布时间】:2015-11-26 22:51:23
【问题描述】:

我尝试在几个数字上绘制具有相似表示但行为略有不同和来源不同的不同数据。所以每个图的Y轴的最小值和最大值是不同的,但比例也是不同的。

例如这是我的批量绘图的一些摘录:

matplotlib 是否存在一种简单的方法来在这些不同的图形上约束相同的 Y 步长,以便进行简单的视觉解释,同时保持自动确定的 Y 最小值和 Y 最大值?

换句话说,我希望每个 Y-tick 之间有相同的 metric 间距

【问题讨论】:

  • 更具体。向我们展示一些数据、您尝试过的内容、产生的结果以及您希望它有何不同。
  • 您是指刻度所在位置之间的相同数据坐标差异,如@tom 的答案所示,还是相同的轴坐标差异(意味着ymax - ymin 对于相同的所有图都是相同的大小)?
  • @askewchan 第二个选项:Ymax - Ymin 对于每个图都是相同的。目前,我发现的唯一方法是 1)计算每个数据集的 Ymax - Ymin 并找到最大范围 2)计算每个数据集的中间值 3)最终,将 Ymin 和 Ymax 设置为 Ymean ± Yrange/2.. . 而有了第二个数据集,情况会变得更糟......我正在寻找一个函数来轻松设置 Yrange 的值(之前粗略和手动估计)
  • 这就是我会做的,@Covich。你可以从图中得到yrange,而不是数据,如果你愿意的话:ymin, ymax = ax.get_ylim()

标签: python matplotlib axis figure


【解决方案1】:

您可以在两个轴上使用来自ticker 模块的MultipleLocator 来定义刻度间距:

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

fig=plt.figure()
ax1=fig.add_subplot(211)
ax2=fig.add_subplot(212)
ax1.set_ylim(0,100)
ax2.set_ylim(40,70)

# set ticks every 10
tickspacing = 10
ax1.yaxis.set_major_locator(ticker.MultipleLocator(base=tickspacing)) 
ax2.yaxis.set_major_locator(ticker.MultipleLocator(base=tickspacing))

plt.show()

编辑:

您想要的行为似乎与我对您问题的解释不同。这是一个函数,它将更改 y 轴的限制,以确保 ymax-ymin 对于两个子图相同,使用两个 ylim 范围中较大的一个来更改较小的一个。

import matplotlib.pyplot as plt
import numpy as np

fig=plt.figure()
ax1=fig.add_subplot(211)
ax2=fig.add_subplot(212)
ax1.set_ylim(40,50)
ax2.set_ylim(40,70)

def adjust_axes_limits(ax1,ax2):

    yrange1 = np.ptp(ax1.get_ylim())
    yrange2 = np.ptp(ax2.get_ylim())

    def change_limits(ax,yr):
        new_ymin = ax.get_ylim()[0] - yr/2.
        new_ymax = ax.get_ylim()[1] + yr/2.
        ax.set_ylim(new_ymin,new_ymax)

    if yrange1 > yrange2:
        change_limits(ax2,yrange1-yrange2)
    elif yrange2 > yrange1:
        change_limits(ax1,yrange2-yrange1)
    else:
        pass

adjust_axes_limits(ax1,ax2)
plt.show()

请注意,这里的第一个子图已从 (40, 50) 扩展到 (30, 60),以匹配第二个子图的 y 范围

【讨论】:

    【解决方案2】:

    汤姆的回答很好! 但我决定使用更简单的解决方案

    我为我的所有地块定义了一个任意的yrange,例如

    yrang = 0.003
    

    对于每个情节,我都会这样做:

    ymin, ymax = ax.get_ylim()
    ymid = np.mean([ymin,ymax])
    ax.set_ylim([ymid - yrang/2 , ymid + yrang/2])
    

    并且可能:

    ax.yaxis.set_major_locator(ticker.MultipleLocator(base=0.005))
    

    【讨论】:

      猜你喜欢
      • 2021-11-26
      • 1970-01-01
      • 2015-09-11
      • 1970-01-01
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多