2015-09-01 2 views
3

Я пытаюсь построить разные данные с похожими изображениями, но несколько разных поведений и разных истоков на нескольких фигурах. Таким образом, мин. & макс оси Y различается между каждой фигурой, но масштаб тоже.та же шкала оси Y по разным цифрам

например. Вот некоторые выдержки из моего пакетного черчения:

enter image description here enter image description here

ли она существует простой способ с Matplotlib на ограничение, один и тот же шаг Y на этих различных фигур, чтобы иметь легкую визуальную интерпретацию, сохраняя при этом автоматически определяется Y min и Y max?

В других словах, я хотел бы иметь такое же метрической расстояния между каждой Y-тиком

+0

быть более конкретными. Покажите нам некоторые данные, что вы пробовали, что они производят и как вы хотите, чтобы они были разными. –

+0

Вы имеете в виду ту же разницу в координатах данных, где расположены тики, как показано в ответе @ tom, или в той же разности координат оси (что означает, что 'ymax - ymin' одинаково для всех графиков одного размера)? – askewchan

+0

@askewchan - второй вариант: Ymax - Ymin одинаковый для каждого сюжета. На данный момент единственным способом, который я нашел, является: 1) вычислить Ymax - Ymin для каждого набора данных и найти самый большой диапазон 2) рассчитать среднее значение для каждого набора данных 3) в конечном счете, установив Ymin и Ymax с Ymean ± Yrange/2 .. . И со вторым набором данных это будет хуже ... Я ищу функцию, которая легко установила значение Yrange (предположительно грубо и вручную до этого) – Covich

ответ

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

EDIT:

Кажется, что ваше желаемое поведение отличалось от того, как я интерпретировал ваш вопрос. Вот функция, которая изменит пределы осей 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), чтобы соответствовать у диапазона второй сюжетные enter image description here

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