крошечная цифра matplotlib при использовании подзаговоров - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь получить график с пользовательским соотношением сторон для правильного отображения. Я использую записные книжки Jupyter для рендеринга, но обычно я делаю это, настраивая атрибут «figsize» в подзадачах. Я сделал это, как показано ниже:

from matplotlib import pyplot as plt
fig,axes = plt.subplots(1,1,figsize=(16.0,8.0),frameon=False)

Проблема в том, что, хотя соотношение сторон кажется правильным (судя по глазу), фигура не расходуется даже близко ко всей ширине страницы и поэтому является крошечной и трудной для чтения.

Полагаю, он ведет себя так, как будто слева и справа установлены какие-то поля, но я не могу найти глобальную настройку, которая контролирует это. Я использовал список настроек здесь , но безуспешно нашел соответствующий.

Мои вопросы

  1. Как настроить соотношение сторон, не влияя на общий размер рисунка (подумайте о размерах шрифта надписей на оси)? Мне не нужно ограничивать ширину моего экрана, я был бы очень рад, если бы ноутбуки Jupyter предоставили мне горизонтальную полосу прокрутки.
  2. Есть ли место с более полной и хорошо написанной документацией по всем доступным matplotlib параметрам? Тот, который я связал выше, неудобен, потому что он дает параметры в форме файла примера matplotlibrc. Я хотел бы знать, существует ли одна страница с (хорошими) описаниями всех параметров.

РЕДАКТИРОВАТЬ: было отмечено, что это может быть проблема с Юпитером, и что я правильно устанавливаю соотношение сторон. Я использую Jupyter версии 1.0.0. Ниже приведена фотография вывода упрощенного блокнота.

picture of figure from ipy notebook

Легко видеть, что фигура не использует даже близко к доступному горизонтальному пространству.

Код в блокноте:

#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: ограничение диапазона векторов диапазоном осей до построения графика приводит к желаемому результату. Смотрите рисунок ниже:

modified jupyter notebook

Добавлены / изменены строки:

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

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Видимо, была ошибка в matplotlib 2.2.2, которая к настоящему времени исправлена ​​в версии для разработчиков.Вы, конечно, можете установить текущую версию разработки с github.

Проблема возникает из-за установки пределов осей (ax1.set_xlim(-10,10)), которые меньше исходного изображения.По какой-то причине исходные ограничения все еще использовались для расчета жесткого bbox для сохранения в формате png.

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

x = np.random.normal(0,5,(20000,))
y = np.random.normal(0,5,(20000,))
bins = np.linspace(-10,10,201)
h = ax1.hist2d(x,y, bins=bins, cmap='inferno')
0 голосов
/ 07 мая 2018

Чтобы изменить размеры шрифта надписей оси, вам нужно будет использовать plt.rc или plt.rcParams (подробнее об этом здесь ), поэтому вам не нужно беспокоиться об этом при использовании figsize.

Я не вижу никаких проблем с кодом, который вы разместили, не могли бы вы опубликовать фотографию того, что вы получаете и что вы хотели бы получить? Вот что я получаю, используя эту конфигурацию на ноутбуках Jupyter, просто рисуя очень простой график: Plot on Jupyter notebook

Обратите внимание, однако, Jupyter автоматически ограничивает размер ваших графиков (см. Ниже): Plot with max width Plot with no max width

И я боюсь, что не могу помочь вам с вашим вторым вопросом, так как я всегда находил документацию на matplotlib достаточной для всех моих нужд ... удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...