【问题标题】:For loop to create multiple histogram png filesFor循环创建多个直方图png文件
【发布时间】:2019-09-21 02:33:31
【问题描述】:

我不确定为什么会发生这种情况。也许这只是一个我看不到的简单错误,但是通过使用此代码:

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))

我在这里获得了像这张附加照片一样创建的所有文件。

关于我做错了什么有什么想法吗?

提前致谢。 attached photo of one histogram output

我想要的结果是这样的。

Desired output

【问题讨论】:

  • 你有错误的缩进,你保存了 4 次同名文件。离开内部for-loop 后应该保存一次
  • 查看代码和图像后,我不明白问题出在哪里。每个图都显示具有不同数量的 bin 以及相同的均值和中值的直方图,因为它们使用来自 DataFrame 的相同数据 - 您甚至可以在循环前计算中值和均值。这个附加的图像有什么问题?你期待什么结果?
  • @furas 这是我的 for 循环应该用不同的直方图保存每个文件的问题;相反,它会将其创建的每个文件的所有直方图放在图中。
  • 如果您想将每个直方图保存在不同的文件中,那么您不必为直方图创建子图,但您必须使用不同的文件名。目前,您对所有直方图使用相同的名称。
  • 您可以在for-loop - ax = plt.subplot(1, 1, 1)ax = plt.subplot() 之前创建单个图,并在绘制直方图ax.clear() 之前清除它。至于文件,您可以使用 i 创建唯一名称 '{}-{}.png'.format(name, i)

标签: python for-loop matplotlib histogram multipleoutputs


【解决方案1】:

它不会创建新的子图,但会使用以前的子图,然后在旧图上绘制新图,因此您必须在绘制新直方图之前使用清晰的子图。

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))

【讨论】:

  • 嗨,谢谢!它给了我每个文件每个 bin 的结果但我想做的是一个 2 x 2 的子图,它显示了一个图中已经存在的所有 bin 大小。知道如何编辑您发送的此代码吗?
  • 我不明白你想要什么。您的原始代码创建 2 x 2 子图并显示所有箱。如果您想要一个地块上的所有垃圾箱,那么为什么需要 2 x 2 个子地块 - 您将有一个地块和 3 个空位。如果您想在一个图上绘制所有内容,则创建一个子图并且不要清除它。并在for-loop 之后保存。
  • 为此我需要在代码中做什么?试了很多次,还是如上图所示
  • 我看到了你想要的输出,现在我看到代码在旧的子图上绘制直方图,所以你在一个子图上有两个(或更多)直方图。在绘制直方图之前,您必须清除子图。请参阅我的新答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-20
  • 2013-01-10
  • 2021-10-31
  • 1970-01-01
  • 2012-09-23
  • 2021-08-03
  • 1970-01-01
相关资源
最近更新 更多