Настройка подзаговоров в matplotlib - PullRequest
0 голосов
/ 30 июня 2018

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

Мой код создает разрыв между двумя верхними и нижними графиками. Можете ли вы помочь мне исправить это?

df_CI
Country China   India
1980    5123    8880
1981    6682    8670
1982    3308    8147
1983    1863    7338
1984    1527    5704

fig = plt.figure() # create figure

ax0 = fig.add_subplot(221) # add subplot 1 (2 row, 2 columns, first plot)
ax1 = fig.add_subplot(222) # add subplot 2 (2 row, 2 columns, second plot). 
ax2 = fig.add_subplot(313) # a 3 digit number where the hundreds represent nrows, the tens represent ncols 
                            # and the units represent plot_number.

# Subplot 1: Box plot
df_CI.plot(kind='box', color='blue', vert=False, figsize=(20, 20), ax=ax0) # add to subplot 1
ax0.set_title('Box Plots of Immigrants from China and India (1980 - 2013)')
ax0.set_xlabel('Number of Immigrants')
ax0.set_ylabel('Countries')

# Subplot 2: Line plot
df_CI.plot(kind='line', figsize=(20, 20), ax=ax1) # add to subplot 2
ax1.set_title ('Line Plots of Immigrants from China and India (1980 - 2013)')
ax1.set_ylabel('Number of Immigrants')
ax1.set_xlabel('Years')

# Subplot 3: Box plot
df_CI.plot(kind='bar', figsize=(20, 20), ax=ax2) # add to subplot 1
ax0.set_title('Box Plots of Immigrants from China and India (1980 - 2013)')
ax0.set_xlabel('Number of Immigrants')
ax0.set_ylabel('Countries')

plt.show()

enter image description here

Ваш совет будет оценен.

1 Ответ

0 голосов
/ 30 июня 2018

Синтаксис субплотов всегда был немного сложным С этими звонками

ax0 = fig.add_subplot(221)
ax1 = fig.add_subplot(222)

Вы делите свою фигуру в сетке 2x2 и заполняете первый ряд.

ax2 = fig.add_subplot(313)

Теперь вы делите его на три строки и заполняете последний.

По сути, вы создаете две независимые сетки подзаговоров, и нет простого способа определить, как разнести подзаголовки из одного относительно другого.

Гораздо более простой и питонический способ - использовать gridspec, чтобы создать единую более мелкую сетку и решить ее с помощью нарезки Python.

fig = plt.figure()
gs = mpl.gridspec.GridSpec(2, 2, wspace=0.25, hspace=0.25) # 2x2 grid
ax0 = fig.add_subplot(gs[0, 0]) # first row, first col
ax1 = fig.add_subplot(gs[0, 1]) # first row, second col
ax2 = fig.add_subplot(gs[1, :]) # full second row

enter image description here

И теперь вы также можете легко настроить интервалы с wspace и hspace.

Более сложные макеты также намного проще, это просто знакомый синтаксис нарезки.

fig = plt.figure()
gs = mpl.gridspec.GridSpec(10, 10, wspace=0.25, hspace=0.25)    
fig.add_subplot(gs[2:8, 2:8])
fig.add_subplot(gs[0, :])
for i in range(5):
    fig.add_subplot(gs[1, (i*2):(i*2+2)])
fig.add_subplot(gs[2:, :2])
fig.add_subplot(gs[8:, 2:4])
fig.add_subplot(gs[8:, 4:9])
fig.add_subplot(gs[2:8, 8])
fig.add_subplot(gs[2:, 9])
fig.add_subplot(gs[3:6, 3:6])

# fancy colors
cmap = mpl.cm.get_cmap("viridis")
naxes = len(fig.axes)
for i, ax in enumerate(fig.axes):
    ax.set_xticks([])
    ax.set_yticks([])
    ax.set_facecolor(cmap(float(i)/(naxes-1)))

gridpec complex layout

...