不同数字上相同的Y轴比例

时间:2015-09-01 15:55:23

标签: python matplotlib axis figure

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

e.g。以下是我的批量绘图的一些摘录:

enter image description here enter image description here

matplotlib是否存在一种简单的方法,可以在这些不同的数字上约束相同的Y步,以便在保持自动确定的Y min和Y max的同时进行简单的视觉解释?

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

2 个答案:

答案 0 :(得分:2)

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

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()

enter image description here

修改

似乎您所期望的行为与我解释您的问题的方式不同。这是一个更改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范围 enter image description here

答案 1 :(得分:0)

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

我为所有情节定义了一个任意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))