Можно ли уменьшить ширину одного подзаголовка в gridspec/Matplotlib?

#python #matplotlib #width #subplot

Вопрос:

У меня есть сетка подзаголовков, созданная с использованием gridspec. Я знаю, как создавать подзаголовки, охватывающие строки и столбцы в gridspec. Можно ли уменьшить ширину одного участка только на небольшую величину? Например, можем ли мы установить соотношение ширины для одного подзаголовка? То, как я хочу, отмечено красным на изображении.

введите описание изображения здесь

Мой код выглядит так:

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

plt.figure(figsize=(6, 4))
gs = gridspec.GridSpec(3, 5,  height_ratios=[0.5,1,1])

for i in range(1, 3):
    for j in range(5):
      ax = plt.subplot(gs[i, j])

ax1 = plt.subplot(gs[0,1:2])
ax2 = plt.subplot(gs[0,2:])

for ax in [ax1, ax2]:
    ax.tick_params(size=0)
    ax.set_xticklabels([])
    ax.set_yticklabels([])
 

Что я пытался:

Я попытался установить соотношение ширины как width_ratios = [1,1,1,1,0.5] , но это уменьшает ширину всего столбца (последнего столбца).

Комментарии:

1. Вы всегда можете сделать ax.set_postion для подзаголовка, который вы хотите сжать.

Ответ №1:

Вы можете использовать GridSpec для макетов с несколькими столбцами. Здесь создайте сетку из 3 строк, 7 столбцов с соотношениями ширины[1,1,0.5,0.5,1,0.5,0.5], и нанесите оси во второй и третьей строках в объединенных 0,5 столбцах.

 gs = GridSpec(3, 7, figure=fig, width_ratios=[1,1,0.5,0.5,1,0.5,0.5])
ax_merged_top = fig.add_subplot(gs[0, 3:6])
ax_row1_pseudocol3 = fig.add_subplot(gs[1, 2:4])
 

Вот полный пример:

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

plt.figure(figsize=(6, 4))
gs = gridspec.GridSpec(3, 7, figure=fig,
                       height_ratios=[0.5,1,1],
                       width_ratios=[1,1,0.5,0.5,1,0.5,0.5])

ax1 = plt.subplot(gs[0,1])
ax_merged_top = plt.subplot(gs[0, 3:6])

for row in [1,2]:
    extra=0
    for col in range(5):
        if col in (2,4):
            ax = plt.subplot(gs[row,col extra:col extra 2])
            extra =1
        else:
            ax = plt.subplot(gs[row,col extra])
 

пользовательские параметры сетки

И теперь вы можете изменить width_ratio на что угодно,при условии, что числа, изначально заданные как [0,5, 0,5], складываются в 1, пример ниже с width_ratios=[1,1,0.3,0.7,1,0.5,0.5]

альтернативное соотношение ширины

Комментарии:

1. Это также изменяет ширину столбцов других вложенных участков.

Ответ №2:

Спасибо @JodyKlymak за упоминание о ax.set_postion методе. @mozway предоставил рабочее решение, но добавление этих нескольких строк в мой код дало мне желаемый результат:

 bb = ax2.get_position()
bb.x1 = 0.84
ax2.set_position(bb)

bb = ax2.get_position()
bb.x0 = 0.50
ax2.set_position(bb)
 

введите описание изображения здесь

Комментарии:

1.Аналогичный подход ll, bb, ww, hh = ax2017.get_position().bounds ax2017.set_position([ll, bb, ww*0.8, hh*0.8])