我尝试根据不同的数据框绘制许多箱形图,尽管我为每个箱形图定义了一个新图,但每个图都绘制在先前的箱形图上(因此只有第一个正确绘制)。
我创建的数据框:
cpu_util=pd.DataFrame.from_dict(cpu_util)
gpu_util=pd.DataFrame.from_dict(gpu_util)
cpu_mem=pd.DataFrame.from_dict(cpu_mem)
gpu_mem=pd.DataFrame.from_dict(gpu_mem)
disk_c_usage=pd.DataFrame.from_dict(disk_c_usage)
disk_c_fs=pd.DataFrame.from_dict(disk_c_fs)
disk_d_usage=pd.DataFrame.from_dict(disk_d_usage)
disk_d_fs=pd.DataFrame.from_dict(disk_d_fs)
和基于上述数据框的箱形图创建:
boxplot =cpu_util.boxplot(rot=90,fontsize=4,grid=True,showfliers=False,whis=[0,100])
fig1 = boxplot.get_figure()
fig1.suptitle('CPU utilization [%]', fontsize=10, fontweight='bold')
boxplot.set_ylabel('Utilization [%]')
boxplot.set_xlabel('Computer name')
boxplot.set_ylim(0,100)
fig1.savefig('cpu_util.pdf')
#### gpu util ####
boxplot2 = gpu_util.boxplot(rot=90,fontsize=4,grid=True,showfliers=False,whis=[0,100])
fig2 = boxplot2.get_figure()
fig2.suptitle('GPU utilization [%]', fontsize=10, fontweight='bold')
boxplot2.set_ylabel('Utilization [%]')
boxplot2.set_xlabel('Computer name')
boxplot2.set_ylim(0,100)
fig2.savefig('gpu_util.pdf')
#### cpu mem ####
boxplot3 = cpu_mem.boxplot(rot=90,fontsize=4,grid=True,showfliers=False,whis=[0,100])
fig3 = boxplot3.get_figure()
fig3.suptitle('CPU memory [%]', fontsize=10, fontweight='bold')
boxplot3.set_ylabel('Memory [%]')
boxplot3.set_xlabel('Computer name')
boxplot3.set_ylim(0,100)
fig3.savefig('cpu_memory.pdf')
我总共创建了6个箱型图(此处仅复制其中一部分,但是思路很明确...)
我在第一个箱形图中获得的结果(并正确绘制):
和第二个(如前所述,绘制在第一个上,可以看到每个框有两条绿线,而不是一行):
数据帧构建不是问题。我检查了一下,发现它们的值正确。
经过大量检查,我猜问题出在数字定义上,但未能解决问题。
答案 0 :(得分:1)
几种方法:
在每plt.clf()
行之后添加fig.savefig()
。除非您清除该图,否则程序将覆盖那里已经存在的任何图。 plt.clf()
清除图并允许您从下一张图像重新开始。
即:
boxplot =cpu_util.boxplot(rot=90,fontsize=4,grid=True,showfliers=False,whis=[0,100])
fig1 = boxplot.get_figure()
fig1.suptitle('CPU utilization [%]', fontsize=10, fontweight='bold')
boxplot.set_ylabel('Utilization [%]')
boxplot.set_xlabel('Computer name')
boxplot.set_ylim(0,100)
fig1.savefig('cpu_util.pdf')
plt.clf()
查看以下示例:matplotlib examples
通过使用plt.subplots()
,您可以创建3个不同的图作为子图,然后将它们另存为一张图像。当然,您可以对6个地块执行类似的操作。
您可以在每个新绘图的开头放置plt.figure()
,这将从头开始创建一个图形。
答案 1 :(得分:0)
如果要创建6个图形,可以使用for循环并在一个循环中创建每个图形。
for i in [cpu_util, gpu_util, cpu_mem, gpu_mem]:
fig, ax= plt.subplots()
ax.boxplot(i)
ax.set_title('CPU utilization [%]', fontsize=10, fontweight='bold')
ax.set_ylabel('Utilization [%]')
ax.set_xlabel('Computer name')
ax.set_ylim(0,100)
fig.savefig('cpu_util.pdf',dpi=300)
上面的代码为每个数据帧创建一个图形。如果要将它们放在子图中,可以使用下面的代码。
c=0 # simple counter
for i in [cpu_util, gpu_util, cpu_mem, gpu_mem]:
row= c//2 # since we have 2 columns row will be either 0 or 1.
col= c%2 # since we have 2 columns columns also will be either 0 or 1.
fig, ax= plt.subplots(2,2) # 2 rows and 2 columns.
ax[row,col].boxplot(i)
ax[row,col].set_title('CPU utilization [%]', fontsize=10, fontweight='bold')
ax[row,col].set_ylabel('Utilization [%]')
ax[row,col].set_xlabel('Computer name')
ax[row,col].set_ylim(0,100)
fig.savefig('cpu_util.pdf',dpi=300)
c+=1
让我知道是否有任何不清楚的地方。