Python boxplot matplotlib автоматический размер фигуры в зависимости от количества категорий - PullRequest
0 голосов
/ 19 февраля 2019

Мне нужно использовать matplotlib, чтобы показать и сохранить диаграмму коробочного графика.

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

Я изо всех сил стараюсь, чтобы это работало динамично.

Когда у меня всего несколько категорий, диаграмма в порядке, но случай ниже (131 категории) Я получаю следующий график:

enter image description here

Итак, я полагаю, что мне нужно каким-то образом установить размер одного поля (илизаполнитель для пустой серии), а затем диаграмма увеличивается на основе box_size * number_of_classes.

Ниже кода, который я пробовал.

f = plt.figure()
# f = plt.figure(figsize=(len(classes) * 2, 50))

# Create an axes instance
ax = f.add_subplot(111)

## add patch_artist=True option to ax.boxplot() 
## to get fill color
bp = ax.boxplot(data_to_plot, patch_artist=True)

## change outline color, fill color and linewidth of the boxes
for box in bp['boxes']:
    # change outline color
    box.set( color='#7570b3', linewidth=2)
    # change fill color
    box.set( facecolor = '#1b9e77' )

## change color and linewidth of the whiskers
for whisker in bp['whiskers']:
    whisker.set(color='#7570b3', linewidth=2)

## change color and linewidth of the caps
for cap in bp['caps']:
    cap.set(color='#7570b3', linewidth=2)

## change color and linewidth of the medians
for median in bp['medians']:
    median.set(color='#b2df8a', linewidth=2)

## change the style of fliers and their fill
for flier in bp['fliers']:
    flier.set(marker='o', color='#e7298a', alpha=0.5)

## Custom x-axis labels
ax.set_xticklabels(classes)

## Remove top axes and right axes ticks
ax.get_xaxis().tick_bottom()
ax.get_yaxis().tick_left()        

if boxplot_output is not None:
    os.makedirs(boxplot_output, exist_ok=True)
    f.savefig(os.path.join(boxplot_output,'box_plot.png'), bbox_inches='tight')

if show:
    plt.show()
    plt.close(f)

Как я могу заставить его работать?

С наилучшими пожеланиями.Клейсон Риос.

1 Ответ

0 голосов
/ 19 февраля 2019

Определение левого и правого поля в дюймах.Выберите размер в дюймах для отображения одной категории.Тогда полная ширина фигуры будет

figwidth = leftmargin + rightmargin + (n+1)*categorysize

Тогда не забудьте настроить параметры подзаговора в зависимости от размера фигуры.

import numpy as np
import matplotlib.pyplot as plt

number = 10
data = np.random.rayleigh(scale=30, size=(20, number))


leftmargin = 0.5 #inches
rightmargin = 0.3 #inches
categorysize = 0.1 # inches

n = data.shape[1]

figwidth = leftmargin + rightmargin + (n+1)*categorysize

fig, ax = plt.subplots(figsize=(figwidth, 4))
fig.subplots_adjust(left=leftmargin/figwidth, right=1-rightmargin/figwidth,
                    top=0.94, bottom=0.1)

ax.boxplot(data, positions=np.arange(n))
ax.set_xlim(-0.5,n-0.5)

plt.show()

Для номера = 10:

enter image description here

Для номера = 42

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...