Я пытаюсь получить график с пользовательским соотношением сторон для правильного отображения. Я использую записные книжки Jupyter для рендеринга, но обычно я делаю это, настраивая атрибут «figsize» в подзадачах. Я сделал это, как показано ниже:
from matplotlib import pyplot as plt
fig,axes = plt.subplots(1,1,figsize=(16.0,8.0),frameon=False)
Проблема в том, что, хотя соотношение сторон кажется правильным (судя по глазу), фигура не расходуется даже близко ко всей ширине страницы и поэтому является крошечной и трудной для чтения.
Полагаю, он ведет себя так, как будто слева и справа установлены какие-то поля, но я не могу найти глобальную настройку, которая контролирует это. Я использовал список настроек здесь , но безуспешно нашел соответствующий.
Мои вопросы
- Как настроить соотношение сторон, не влияя на общий размер рисунка (подумайте о размерах шрифта надписей на оси)? Мне не нужно ограничивать ширину моего экрана, я был бы очень рад, если бы ноутбуки Jupyter предоставили мне горизонтальную полосу прокрутки.
- Есть ли место с более полной и хорошо написанной документацией по всем доступным
matplotlib
параметрам? Тот, который я связал выше, неудобен, потому что он дает параметры в форме файла примера matplotlibrc
. Я хотел бы знать, существует ли одна страница с (хорошими) описаниями всех параметров.
РЕДАКТИРОВАТЬ: было отмечено, что это может быть проблема с Юпитером, и что я правильно устанавливаю соотношение сторон. Я использую Jupyter версии 1.0.0. Ниже приведена фотография вывода упрощенного блокнота.
Легко видеть, что фигура не использует даже близко к доступному горизонтальному пространству.
Код в блокноте:
#imports
import numpy as np
#set up a plot
import matplotlib as mpl
from matplotlib import pyplot as plt
#got smarter about the mpl config: see mplstyles/ directory
plt.style.use('standard')
#set up a 2-d plot
fig,axes = plt.subplots(1,1,figsize=(16.0,8.0),frameon=False)
ax1 = axes
#need to play with axis
mpl.rcParams['ytick.minor.visible'] = False
xmin = -10
xmax = 10
ymin = -10
ymax = 10
x = np.random.normal(0,5,(20000,))
y = np.random.normal(0,5,(20000,))
h = ax1.hist2d(x,y, bins=200, cmap='inferno')
ax1.set_xlim(xmin,xmax)
ax1.set_ylim(ymin,ymax)
ax1.set_xlabel('epoch time [Unix]',**axis_font)
ax1.set_ylabel(r'relative time [$\mu$s]',**axis_font)
ax1.grid(True)
#lgnd= ax1.legend(loc=2,prop={'size':22})
for axis in ['top','bottom','left','right']:
ax1.spines[axis].set_linewidth(2)
plt.tight_layout()
#plt.savefig('figures/thefigure.eps')
plt.show()
Файл стиля mpl, который я использую в команде plt.style.use
:
#trying to customize here, see:
#https://matplotlib.org/users/customizing.html
#matplotlib.rc('figure', figsize=(3.4, 3.4*(4/6)))
lines.linewidth : 2
#ticks
xtick.top : False
xtick.bottom : True
xtick.minor.visible : True
xtick.direction : in
xtick.major.size : 8
xtick.minor.size : 4
xtick.major.width : 2
xtick.minor.width : 1
xtick.labelsize : 22
ytick.left : True
ytick.right : False
ytick.minor.visible : True
ytick.direction : in
ytick.major.size : 8
ytick.minor.size : 4
ytick.major.width : 2
ytick.minor.width : 1
ytick.labelsize : 22
#error bars
#errorbar.capsize : 3
#axis stuff
axes.labelsize : 22
РЕДАКТИРОВАНИЕ 2: ограничение диапазона векторов диапазоном осей до построения графика приводит к желаемому результату. Смотрите рисунок ниже:
Добавлены / изменены строки:
xnew = x[(np.abs(x)<10) & (np.abs(y)<10)]
ynew = y[(np.abs(x)<10) & (np.abs(y)<10)]
h = ax1.hist2d(xnew,ynew, bins=200, cmap='inferno')