我需要使用matplotlib来显示和保存箱线图。
但是类别的数量是可变的,因此,我不能具有固定的figsize,并且必须根据类别的数量来调整figure大小(画布区域)。
我正在努力使它以动态方式工作。
当我只有几个类别时,图表还可以,但是下面的情况(131个类别)中,我得到以下图表:
因此,我想我应该以某种方式设置单个框的大小(或为空系列添加一个占位符),然后图表根据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)。
答案 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:
对于数字= 42