Бокплоты датафрейма построены неправильно - PullRequest
0 голосов
/ 25 сентября 2018

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

Созданный мной фрейм данных:

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 боксов (скопируйте здесь только часть из них, но идея ясна...)

результат, полученный мною для первого коробочного графика (и он составлен правильно):

первый боксплот

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

второй блок-график

Построение данных не является проблемой.Я проверил, и они построили с правильными значениями.

После долгих проверок, я думаю, проблема в том, что что-то с рисунком определяет, но не может указать на проблему.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Пара способов сделать это:

  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

    Там, используя plt.subplots(), вы сможете создать 3 разных графика в виде вспомогательных участков, а затем сохранить их как одно изображение.Конечно, вы можете сделать аналогичную вещь для 6 сюжетов.

  3. Вы можете поставить plt.figure() в начале каждого нового сюжета, что создаст фигуру с нуля.

0 голосов
/ 25 сентября 2018

Если вы хотите создать 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

Дайте мне знать, если что-то не понятно.

...