基于类别数量的Python boxplot matplotlib自动图形大小

时间:2019-02-18 22:53:45

标签: python matplotlib

我需要使用matplotlib来显示和保存箱线图。

但是类别的数量是可变的,因此,我不能具有固定的figsize,并且必须根据类别的数量来调整figure大小(画布区域)。

我正在努力使它以动态方式工作。

当我只有几个类别时,图表还可以,但是下面的情况(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)

我如何使它工作?

最好的问候。 克莱森里奥斯(Kleyson Rios)。

1 个答案:

答案 0 :(得分:0)

以英寸为单位定义左右边距。选择您希望一个类别显示的英寸数。那么整个图形的宽度是

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