2016-09-23 6 views
0

Я новичок в python и имею некоторые трудности с построением графика, используя pyplot. Моя цель - построить сетку графиков в строке (%pylab inline) в ноутбуке Juypter.Использование pyplot для создания сетки графиков

Я запрограммировал функцию plot_CV, которая вычисляет перекрестную проверку erorr над степенью полинома некоторого x, где на разных участках предполагается, что степень штрафа (лямбда) изменяется. В конечном итоге в лямбда есть 10 элементов, и они контролируются первым аргументом в plot_CV. Так

fig = plt.figure() 
ax1 = fig.add_subplot(1,1,1) 
ax1 = plot_CV(1,CV_ve=CV_ve) 

дает

enter image description here

Теперь я думаю, что я должен использовать add_subplot, чтобы создать сетку участков, как в

fig = plt.figure() 
ax1 = fig.add_subplot(2,2,1) 
ax1 = plot_CV(1,CV_ve=CV_ve) 
ax2 = fig.add_subplot(2,2,2) 
ax2 = plot_CV(2,CV_ve=CV_ve) 
ax3 = fig.add_subplot(2,2,3) 
ax3 = plot_CV(3,CV_ve=CV_ve) 
ax4 = fig.add_subplot(2,2,4) 
ax4 = plot_CV(4,CV_ve=CV_ve) 
plt.show() 

enter image description here

Если я буду продолжать это , однако, тогда графики становятся все меньше и меньше и начинают перекрываться на ярлыках x и y. Вот картина с сюжетом 3 на 3.

enter image description here

Есть ли способ пространства участки равномерно, так, чтобы они не перекрывали друг друга и лучше использовать горизонтальное и вертикальное пространство в линии в Jupyter Notebook? Чтобы проиллюстрировать этот момент здесь скриншот из jupyter:

enter image description here

Конечная нота: мне еще нужно добавить заголовок или аннотацию с текущим уровнем лямбда, используемого в plot_CV.


Edit: Используя плотную компоновку, как предложено, дает:

enter image description here


Edit 2: Использование fig.set_figheight и fig.set_figwidth я мог, наконец, использовать всю длину и доступный.

enter image description here

+1

Вы пытались '' '' plt.tight_layout() '' 'перед' '' plt.show() '' '. В противном случае вам придется уменьшить частоту метки и размеры метки оси. – sascha

+0

@sascha спасибо, см. Обновление – tomka

ответ

3

Первое предложение к вам проблема будет взглянуть на «Tight Layout guide» для Matplotlib.

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

Кроме того, вы можете контролировать размер всех фигур, используя рисунок из класса matplotlib.figure.

Рисунок (figsize = (х, у))

figsize: X, Y (дюймы)

EDIT:

Вот пример, который я вытащил из сайта Matplotlib и добавлены в:

fig.set_figheight (15) fig.set_figwidth (15)

import matplotlib.pyplot as plt 

plt.rcParams['savefig.facecolor'] = "0.8" 

def example_plot(ax, fontsize=12): 
    ax.plot([1, 2]) 
    ax.locator_params(nbins=3) 
    ax.set_xlabel('x-label', fontsize=fontsize) 
    ax.set_ylabel('y-label', fontsize=fontsize) 
    ax.set_title('Title', fontsize=fontsize) 

plt.close('all') 
fig = plt.figure() 

fig.set_figheight(15) 
fig.set_figwidth(15) 


ax1 = plt.subplot2grid((3, 3), (0, 0)) 
ax2 = plt.subplot2grid((3, 3), (0, 1), colspan=2) 
ax3 = plt.subplot2grid((3, 3), (1, 0), colspan=2, rowspan=2) 
ax4 = plt.subplot2grid((3, 3), (1, 2), rowspan=2) 

example_plot(ax1) 
example_plot(ax2) 
example_plot(ax3) 
example_plot(ax4) 

plt.tight_layout() 

Вы можете достигнуть отступы ваших сюжетных с помощью tight_layout таким образом:

plt.tight_layout (подушечка = 0,4, w_pad = 0,5, h_pad = 1,0)

Таким образом, вы можете держать подзаговоры от скученности друг друга еще дальше.

Имейте хороший!

+0

Вы достигли желаемого проекта по созданию участка? Они выглядят лучше :) Мне любопытно, потому что я сам скоро буду делать много сюжетов, подобных этому, и хотел бы знать. –

+0

Нет, пока не работает. Результаты, находящиеся под редактированием, все еще выглядят неудовлетворительными для меня. Он не реагирует на команду управления размером фигуры; нет ошибки, но и никаких изменений в размере. – tomka

+0

Вы хотите контролировать все размеры подзаголовки отдельно или весь участок вместе? –

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