Автоматизируйте размер фигуры matplotlib на основе заголовка

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

Посмотрите на следующий пример (с поддельными данными):

import numpy as np
import matplotlib.pyplot as plt

data = dict(var1=np.random.normal(0, 1, 1000), var2=np.random.normal(0, 2, 1000), var3=np.random.normal(1, 2, 1000))
var_title = 'Really really long overlapping title'
fig = plt.figure()
for i in range(len(data)):
    plt.subplot(1, 3, i + 1)
    plt.boxplot(data[data.keys()[i]])
    plt.title(var_title)
    plt.show()

Этот код генерирует следующий рисунок: введите здесь описание изображения

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

Я прошу об этом, потому что создание этого рисунка является частью пакетного процесса, в котором рисунки автоматически сохраняются и используются при создании PDF-документов, поэтому я не могу участвовать в изменении размеров рисунка по одному.


person Álvaro Méndez Civieta    schedule 12.12.2018    source источник
comment
Может быть, вы хотите установить fig.suptitle вместо трех отдельных?   -  person ImportanceOfBeingErnest    schedule 12.12.2018


Ответы (2)


Чтобы создать заголовок для нескольких подзаговоров, вы можете использовать Figure.suptitle Вместо рис.названия и формата размер шрифта и вроде там указано.

Таким образом, ваш код будет выглядеть так:

import numpy as np
import matplotlib.pyplot as plt

data = dict(var1=np.random.normal(0, 1, 1000), 
var2=np.random.normal(0, 2, 1000), var3=np.random.normal(1, 2, 1000))
var_title = 'Really really long overlapping title'
fig = plt.figure()
fig.suptitle(var_title)
for i in range(len(data)):
    plt.subplot(1, 3, i + 1)
    plt.boxplot(data[data.keys()[i]])
    plt.show()

На вопрос также отвечает здесь orbeckst.

person rLevv    schedule 12.12.2018

Основываясь на комментарии @ImportanceOfBeingErnest, вы можете сделать это:

import numpy as np
import matplotlib.pyplot as plt

data = dict(var1=np.random.normal(0, 1, 1000), var2=np.random.normal(0, 2, 1000), var3=np.random.normal(1, 2, 1000))
var_title = 'Really really long overlapping title' 


f, ax = plt.subplots(1, 3)
for i in range(len(data)):
    ax[i].boxplot(data[list(data.keys())[i]])
f.suptitle(var_title)
plt.show()

Результат

person Caio Belfort    schedule 12.12.2018