2013-11-27 2 views
6

Возможно ли сделать график с двумя независимыми осями y, чтобы метки были выровнены?matplotlib align twinx tick marks

Ниже приведен пример половины решения. Я удвоил ось y, используя twinx, но метки не выровнены, а линии сетки образуют неудобный шаблон на графике. Есть ли способ заставить метки отмечать одни и те же позиции, но соответствуют разным значениям y? В приведенном ниже примере я хотел бы отметить отметку для 5 слева, чтобы она находилась в том же вертикальном положении, что и знак галочки для 6 справа.

import numpy as np 

a = np.random.normal(10, 3, size=20) 
b = np.random.normal(20, 5, size=40) 

fig, ax1 = plt.subplots() 
ax2 = ax1.twinx() 
ax1.hist(a) 
ax2.hist(b) 

histograms

Точка Всеобъемлющая этого упражнения является создание сетки линий перекрытия для двух осей.

ответ

9

Вам необходимо вручную установить yticks в том виде, в каком он находится, они автоматически рассчитываются, что приводит к изменению. Добавление что-то вроде этого:

ax1.set_yticks(np.linspace(ax1.get_ybound()[0], ax1.get_ybound()[1], 5)) 
ax2.set_yticks(np.linspace(ax2.get_ybound()[0], ax2.get_ybound()[1], 5)) 

где мы устанавливаем ytick местоположения, используя массив 5 точек между пределами оси. Поскольку у вас есть гистограмма можно просто установить более низкое значение до нуля в каждом конкретном случае, и вы можете иметь верхнюю границу несколько больше, так что я бы вместо того, чтобы иметь

ax1.set_yticks(np.linspace(0, ax1.get_ybound()[1]+1, 5)) 
ax2.set_yticks(np.linspace(0, ax2.get_ybound()[1]+1, 5)) 

Предоставление участка (с изменением цвет и прозрачность (альфа) для ясности):

enter image description here

+0

Поскольку границы всегда определяются двумя числами (если не определено), следующее также создает 5 точек между уже определенными пределами оси: 'ax1. set_yticks (np.linspace (* ax1.get_ybound(), 5) '. –

Смежные вопросы