Python 一直在覆盖以前的情节,但没有用所需的情节保存它

Posted

技术标签:

【中文标题】Python 一直在覆盖以前的情节,但没有用所需的情节保存它【英文标题】:Python keeps overwriting hist on previous plot but doesn't save it with the desired plot 【发布时间】:2019-01-09 01:46:55 【问题描述】:

我正在保存两个单独的数字,每个应该包含 2 个图。

问题是第一个图没问题,但第二个图不会在新图上被覆盖,而是在前一个图上被覆盖,但在保存的图中,我只找到其中​​一个图:

这是第一个数字,我正确地得到了第一个数字:

import scipy.stats as s
import numpy as np
import os
import pandas as pd
import openpyxl as pyx
import matplotlib
matplotlib.rcParams["backend"] = "TkAgg"
#matplotlib.rcParams['backend'] = "Qt4Agg"
#matplotlib.rcParams['backend'] = "nbAgg"
import matplotlib.pyplot as plt
import math

data = [336256, 620316, 958846, 1007830, 1080401]
pdf = array([ 0.00449982,  0.0045293 ,  0.00455894,  0.02397463,
    0.02395788,  0.02394114])

fig, ax = plt.subplots();
fig = plt.figure(figsize=(40,30))

x = np.linspace(np.min(data), np.max(data), 100); 
plt.plot(x, s.exponweib.pdf(x, *s.exponweib.fit(data, 1, 1, loc=0, scale=2)))
plt.hist(data, bins = np.linspace(data[0], data[-1], 100), normed=True, alpha= 1)
text1= ' Weibull'
plt.savefig(text1+  '.png' )

datar =np.asarray(data)
mu, sigma = datar.mean() , datar.std() # mean and standard deviation

normal_std = np.sqrt(np.log(1 + (sigma/mu)**2))
normal_mean = np.log(mu) - normal_std**2 / 2
hs = np.random.lognormal(normal_mean, normal_std, 1000)
print(hs.max())    # some finite number
print(hs.mean())   # about 136519
print(hs.std())    # about 50405

count, bins, ignored = plt.hist(hs, 100, normed=True)    
x = np.linspace(min(bins), max(bins), 10000)
pdfT = [];
for el in range (len(x)):
    pdfTmp = (math.exp(-(np.log(x[el]) - normal_mean)**2 / (2 * normal_std**2)))
    pdfT += [pdfTmp]


pdf = np.asarray(pdfT)

这是第二组:

fig, ax = plt.subplots();
fig = plt.figure(figsize=(40,40))

plt.plot(x, pdf, linewidth=2, color='r')
plt.hist(data, bins = np.linspace(data[0], data[-1], 100), normed=True, alpha= 1)

text= ' Lognormal '
plt.savefig(text+ '.png' )

第一个图将直方图与曲线一起保存。而第二个只保存曲线

更新1:查看This Question,我发现清除情节历史有助于数字不会混淆,但仍然是我的第二组情节,我的意思是对数正态不一起保存,我只得到曲线而不是直方图。

【问题讨论】:

【参考方案1】:

发生这种情况,因为您设置了 normed = True,这意味着直方图下方的区域被归一化为 1。由于您的 bin 非常宽,这意味着直方图条的实际高度非常小(在这种情况太小以至于它们不可见)

如果你使用

n, bins, _ = plt.hist(data, bins = np.linspace(data[0], data[-1], 100), normed=True, alpha= 1)

n 将包含您的 bin 的 y 值,您可以自己确认。 另请查看plt.hist 的文档。

因此,如果您将 normed 设置为 False,则直方图将可见。

编辑:箱数

import numpy as np
import matplotlib.pyplot as plt

rand_data = np.random.uniform(0, 1.0, 100)

fig = plt.figure()

ax_1 = fig.add_subplot(211)
ax_1.hist(rand_data, bins=10)

ax_2 = fig.add_subplot(212)
ax_2.hist(rand_data, bins=100)

plt.show()

会给你两个相似的图(因为它是随机的):

它显示了 bin 的数量如何改变直方图。 直方图将数据沿一维的分布可视化,因此不确定输入和 bin 的数量是什么意思。

【讨论】:

哇非常感谢!!请问你为什么这样写:n,bins,_下划线是什么? 我也想知道一点,为什么 bin 的数量比我输入数据的数量 5 高? 这很有指导意义!我忘记了我对对数正态图的处理方式不同,它们已经被标准化了 plt.hist 返回一个由 3 个值组成的元组,(n、bin、patch),因为patch 不相关,我只是使用 _ 作为它的值。关于 bin 的数量,您可以使用 bins 参数设置 bin 及其边缘,即使用 bins = np.linspace(data[0], data[-1], 100) 创建 100 个 bin,使用第一个的左边缘对应x中的最小值,最后一个边缘的右边缘对应x中的最大值。 非常感谢,所以如果我决定始终拥有 5 个垃圾箱,是否足以让它变成 5 个而不是 100 个?因为我认为垃圾箱是输入数量的直接指标

以上是关于Python 一直在覆盖以前的情节,但没有用所需的情节保存它的主要内容,如果未能解决你的问题,请参考以下文章

删除所有超过 4 周的 docker 镜像所需的简单脚本

iPhone中所有设备覆盖屏幕所需的图像大小

覆盖 Primefaces 输入组件所需的验证消息

Python 代码未显示所需的输出但继续运行

覆盖用户/产品权限所需的最少组数

对象深度以获得所需的数组,numpy随机选择