数据框的箱形图未正确绘制

时间:2018-09-25 12:56:13

标签: python pandas graph boxplot

我尝试根据不同的数据框绘制许多箱形图,尽管我为每个箱形图定义了一个新图,但每个图都绘制在先前的箱形图上(因此只有第一个正确绘制)。

我创建的数据框:

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个箱型图(此处仅复制其中一部分,但是思路很明确...)

我在第一个箱形图中获得的结果(并正确绘制):

first boxplot

和第二个(如前所述,绘制在第一个上,可以看到每个框有两条绿线,而不是一行):

second boxplot

数据帧构建不是问题。我检查了一下,发现它们的值正确。

经过大量检查,我猜问题出在数字定义上,但未能解决问题。

2 个答案:

答案 0 :(得分:1)

几种方法:

  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()
    
  2. 查看以下示例:matplotlib examples

    通过使用plt.subplots(),您可以创建3个不同的图作为子图,然后将它们另存为一张图像。当然,您可以对6个地块执行类似的操作。

  3. 您可以在每个新绘图的开头放置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

让我知道是否有任何不清楚的地方。