Цикл For для создания нескольких файлов гистограммы - PullRequest
0 голосов
/ 21 сентября 2019

Я не уверен, почему это происходит.Может быть, это просто простая ошибка, которую я не вижу, но используя этот код:

for filename in glob.glob('/Users/jacob/Desktop/MERS/new/NOT COAL/gensets/statistics_per_lgu/per_lgu_files/*.csv'):
    base = os.path.basename(filename)
    name = os.path.splitext(base)[0]
    df = pd.read_csv(filename)

    # Show 4 different binwidths
    for i, binwidth in enumerate([10, 20, 30, 40]):
        # Set up the plot
        ax = plt.subplot(2, 2, i + 1)

        plt.subplots_adjust( wspace=0.5, hspace=0.5)

        # Draw the plot
        ax.hist(df['New Capacity based on 0.8 PF'], bins=binwidth,
                color='red', edgecolor='black',alpha=0.5)

        # Title and labels
        ax.set_title('Histogram with Binwidth = %d' % binwidth, size=10)
        ax.set_xlabel('Capacity', size=11)
        ax.set_ylabel('Frequency count', size=11)

        ax.axvline(x=df['New Capacity based on 0.8 PF'].median(), linestyle='dashed', alpha=0.3, color='blue')
        min_ylim, max_ylim = plt.ylim()
        ax.text(x=df['New Capacity based on 0.8 PF'].median(),y= max_ylim*0.9, s='Median', alpha=0.7, color='blue',fontsize = 12)

        ax.axvline(x=df['New Capacity based on 0.8 PF'].mean(), linestyle='dashed', alpha=0.9, color='green')
        min_ylim, max_ylim = plt.ylim()
        ax.text(x=df['New Capacity based on 0.8 PF'].mean(),y= max_ylim*0.5, s='Mean', alpha=0.9, color='green',fontsize = 12)

        plt.tight_layout()
        plt.grid(True)
        plt.savefig('/Users/jacob/Documents/Gensets_gis/historgrams/per_lgu_files/{}.png'.format(name))

, я получаю все файлы, созданные как эта прикрепленная фотография здесь.

Любые идеи относительно того, что ясделали неправильно?

Заранее спасибо. прикрепленная фотография одного выхода гистограммы

Мой желаемый результат будет примерно таким.

Желаемый вывод

1 Ответ

0 голосов
/ 21 сентября 2019

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

ax = plt.subplot(2, 2, i + 1)
ax.clear()

Примеркод.Это дает желаемый результат, но если вы удалите `ax.clear (), то первое изображение будет в порядке, но вы получите новый график со старыми графиками на втором и третьем изображениях.

import os
import pandas as pd
import matplotlib.pyplot as plt
import random

for n in range(3):
    filename = f'example_data_{n}.csv'
    base = os.path.basename(filename)
    name = os.path.splitext(base)[0]

    df = pd.DataFrame({'New Capacity based on 0.8 PF': random.choices(list(range(1000)), k=100)})

    data = df['New Capacity based on 0.8 PF']
    median = data.median()
    mean = data.mean()


    # Show 4 different binwidths
    for i, binwidth in enumerate([10, 20, 30, 40]):
        # Set up the plot
        ax = plt.subplot(2,2,i+1)

        ax.clear()  # <--- it removes previous histogram 

        plt.subplots_adjust( wspace=0.5, hspace=0.5)

        # Draw the plot
        ax.hist(data , bins=binwidth, color='red', edgecolor='black',alpha=0.5)

        # Title and labels
        ax.set_title('Histogram with Binwidth = %d' % binwidth, size=10)
        ax.set_xlabel('Capacity', size=11)
        ax.set_ylabel('Frequency count', size=11)

        min_ylim, max_ylim = plt.ylim()

        ax.axvline(x=median, linestyle='dashed', alpha=0.3, color='blue')
        ax.text(x=median, y= max_ylim*0.9, s='Median', alpha=0.7, color='blue',fontsize = 12)

        ax.axvline(x=mean, linestyle='dashed', alpha=0.9, color='green')
        ax.text(x=mean, y= max_ylim*0.5, s='Mean', alpha=0.9, color='green',fontsize = 12)

        plt.tight_layout()
        plt.grid(True)

    plt.savefig('{}.png'.format(name))
...