#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])