【问题标题】:Saving two different figures on different files with matplotlib使用 matplotlib 在不同文件中保存两个不同的图形
【发布时间】:2020-06-17 08:04:05
【问题描述】:

这可能很明显,但我做不到。我是 Python 新手,最近开始使用 matplotlib,所以我看不到问题。

我正在做以下事情:

  • 创建一个 pandas.DataFrame
  • 制作直方图并保存为 png 文件
  • 创建DataFrame的新列
  • 制作该列的直方图并保存为新的 png 文件

我得到的是两个具有相同图形的 png 文件:DataFrame 直方图。 (我记得在 MATLAB 上有类似的问题,我花了一些时间才找到方法)

代码如下:

import os
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# Suppose 'housing' is a pandas.DataFrama with shape (20640, 11)

# Make a histogram of each column of housing data frame
housing.hist(bins=50, figsize=(20, 15))

# Save histogram as a file
os.makedirs('im', exist_ok=True)
plt.savefig('im/housing_hist.png')

# Create a new attribute which represent income category
housing["income_cat"] = pd.cut(housing["median_income"],
                               bins=[0., 1.5, 3.0, 4.5, 6., np.inf],
                               labels=[1, 2, 3, 4, 5])

# Create a histogram of income_cat
housing["income_cat"].hist()
plt.savefig('im/income_cat_hist.png')

我需要帮助来保存不同的文件。

感谢您的宝贵时间。

【问题讨论】:

    标签: python pandas matplotlib histogram


    【解决方案1】:

    从图形对象中保存图形更可靠。在 Python(以及最新版本的 MATLAB)中,图形是一种特殊的数据类型。 pandas hist 函数返回一个坐标区或坐标区数组。

    如果您正在制作单轴,您可以使用figure 属性获取图形,然后从中调用savefig

    所以这样的事情应该可以工作。

    ax1 = housing.hist(bins=50, figsize=(20, 15))
    ax1.figure.savefig('im/housing_hist.png')
    

    如果你要制作多个轴,你会得到一个 numpy 数组轴,你可以将其展平并获取第一个元素:

    axs1 = housing.hist(bins=50, figsize=(20, 15))
    axs1.ravel()[0].figure.savefig('im/housing_hist.png')
    

    编辑:为了清楚起见,对于第二个数字,您应该这样做:

    ax2 = housing["income_cat"].hist()
    ax2.figure.savefig('im/income_cat_hist.png')
    

    【讨论】:

    • 谢谢,这有助于我更好地了解这些对象,但它对保存两个不同的数字没有帮助。
    • 我在使用ax1.figure.savefig('...') 时遇到错误,因为 ax1 是直方图数组:AttributeError: 'numpy.ndarray' object has no attribute 'figure'
    • @JorgeE 我在第二个例子中解释了如何处理这个问题。
    • 好的,我明白了,但我需要保存整组直方图,就像 plt.savefig 所做的那样,而不仅仅是一个元素。有没有办法使用一条线来做到这一点?谢谢!
    • @JorgeE 是的,这就是第二个示例的作用。你没试过,是吗?所有直方图都是单个图形的一部分。第二个示例所做的是获取与第一个直方图关联的图形,并将其保存。但由于所有其他直方图也是同一图形的一部分,因此它将保存所有直方图。所以你使用哪个直方图实际上并不重要,只是第一个总是存在的,所以它是显而易见的选择。在断定它们不起作用之前,请尝试您给出的答案。
    【解决方案2】:

    好吧,我认为解决方案是在每个 plt.savefig('...') 之后添加一个 plt.clf()。我看到这个帖子是为了得到它:

    matplotlib.pyplot will not forget previous plots - how can I flush/refresh?

    我希望得到比我更好的答案。

    【讨论】:

    • 更好的答案here.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    相关资源
    最近更新 更多