Автоматизировать размер рисунка matplotlib на основе заголовка - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть набор из трех переменных, для которых я хотел бы рассчитать коробочный график.Три переменные имеют одинаковый заголовок и имеют разные метки 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()

Этот код генерирует следующий рисунок: enter image description here

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

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

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

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

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

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.

0 голосов
/ 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()

Result

...