Сюжеты Pyplot с одинаковой абсолютной шкалой, но с разными пределами - PullRequest
1 голос
/ 12 июня 2019

Я не уверен, что моя формулировка верна, но я пытаюсь создать фигуру из двух участков, где два графика имеют разные пределы, но их размер таков, что физический масштаб (как, например, у -дистанция на сантиметр высоты фигуры) одинакова. Для пояснения, скажем, субплот 1 показывает данные от -3 до 3, а субплот 2 показывает данные от -1 до 1. Я хочу, чтобы они располагались ниже друг друга таким образом, чтобы высота субплота 2 (исключая тики, просто все внутри кадр) составляет ровно треть подпункта 1.

Моя попытка была следующей:

from matplotlib import gridspec
from matplotlib import pyplot as plt
import numpy as np

x = np.linspace(0,2, 101)
y1 = 3*np.cos(x*np.pi)
y2 = np.cos(x*np.pi)

fig = plt.figure(figsize=(4, 6)) 
gs = gridspec.GridSpec(8, 1)
ax1 = plt.subplot(gs[0:6,0])
ax1.plot(x, y1, c='orange')
ax1.set_ylim(-3, 3)
ax1.set_xticks([], [])
ax2 = plt.subplot(gs[6:,0])
ax2.plot(x, y2, c='green')
ax2.set_ylim(-1,1)
ax2.set_xticks([0, 1, 2])
ax2.set_xticklabels([r'0', r'0.5', r'1'])
ax2.set_xlabel(r'$n_g$ (2e)')
plt.tight_layout()
fig.text(-0.025, 0.5, 'Frequency (GHz)', ha='center', va='center', rotation='vertical', size=18)

, что приводит к приведенному ниже рисунку, но, как вы можете видеть (хотя вам нужно присмотреться), диапазон от -1 до 1 во втором подзадаче сжимается (занимает меньше высоты), чем диапазон от -1 до 1 в подзаговоре 1 Я предполагаю, что это из-за пробела между двумя участками.

Обратите внимание, что я использую gridspec, потому что планирую добавить еще один столбец вспомогательных участков с интересными пропорциями и собственными метками и ограничениями. Я не знал, как добавить глобальный ylabel более элегантным способом, если кому-то интересно.

enter image description here

1 Ответ

1 голос
/ 12 июня 2019

Вы можете установить height_ratios спецификации сетки в соответствии с диапазоном пределов.

from matplotlib import gridspec
from matplotlib import pyplot as plt
import numpy as np

x = np.linspace(0,2, 101)
y1 = 3*np.cos(x*np.pi)
y2 = np.cos(x*np.pi)

ylim1 = -3,3
ylim2 = -1,1

fig = plt.figure(figsize=(4, 6), constrained_layout=True) 
gs = gridspec.GridSpec(2, 1, height_ratios=[np.diff(ylim1)[0], 
                                            np.diff(ylim2)[0]], figure=fig)
ax1 = plt.subplot(gs[0,0])
ax1.plot(x, y1, c='orange')
ax1.set_ylim(ylim1)
ax1.set_xticks([], [])

ax2 = plt.subplot(gs[1,0])
ax2.plot(x, y2, c='green')
ax2.set_ylim(ylim2)
ax2.set_xticks([0, 1, 2])
ax2.set_xticklabels([r'0', r'0.5', r'1'])
ax2.set_xlabel(r'$n_g$ (2e)')

plt.show()
...