使用matplotlib在同一帧上绘制曲线图和直方图

时间:2019-06-16 09:57:52

标签: python python-3.x matplotlib plot

我希望曲线和直方图与matplotlib并存于同一图上。曲线是法线,直方图由数据集组成。我想将直方图(样本的实际重新划分)与曲线进行比较(如果我有大量数据,样本的重新划分应该是什么)。目的是检查除危害之外是否还有其他因素。

这是代码:

def testHistogram(arr, mean, variance):
    from matplotlib import pyplot as plt
    import numpy as np
    import scipy.stats as stats
    import math

    # histogram
    num_bins = 100
    plt.hist(arr, num_bins, facecolor='yellow', alpha=0.5)

    # plot
    mu = mean
    sigma = math.sqrt(variance)
    x = np.linspace(mu - 3*sigma, mu + 3*sigma, 100)
    plt.plot(x, stats.norm.pdf(x, mu, sigma))

    plt.grid(True)
    plt.show()

我的问题是,曲线没有出现。 (直方图似乎工作正常)。

参数:

  • arr:值列表(我要与曲线比较的样本)
  • mean:样本的平均值,以建立相应的曲线
  • variance:样本的方差,以建立相应的曲线

编辑:如评论中所述,这是创建参数的方法:

#create a dataset for testing - i am getting it from a database 
import random
myList = []
while (i<100):
    randomnumber = random.randint(1,100)
    myList.append(randomnumber)
    i = i+1
#get the mean and variance of the dataset
count = 0
sum = 0
squaresSum = 0
theMean = 0
for onedata in dataset:
    count = count+1
    sum = sum + onedata
    squaressum = squaresSum + onedata*onedata
theMean = sum/count
theVariance = squaresSum/count - theMean*theMean

# launch the function
testHistogram(myList, theMean, theVariance)

1 个答案:

答案 0 :(得分:1)

实际上,您的代码几乎可以正常工作,您只需要标准化直方图即可。 scipy.stats.norm返回归一化的曲线,即曲线的积分为1。
在您的情况下,您可能在x轴上有一条非常低的曲线,几乎看不到。

要标准化直方图,只需将参数density = True传递给hist函数:

plt.hist(arr, num_bins, density=True, facecolor='yellow', alpha=0.5)

例如,以下代码(对您的代码进行少量修改):

from matplotlib import pyplot as plt
import numpy as np
import scipy.stats as stats
import math

def testHistogram(arr, mean, variance):
    # histogram
    num_bins = 100
    plt.hist(arr, num_bins, density=True, facecolor='yellow', alpha=0.5)

    # plot
    mu = mean
    sigma = math.sqrt(variance)
    x = np.linspace(mu - 3*sigma, mu + 3*sigma, 100)
    plt.plot(x, stats.norm.pdf(x, mu, sigma))

    plt.grid(True)
    plt.show()


mm = 100  #norm mean valu
vv = 40   #norm variance
#x is an array of 100 random numbers from the normal distribution
x = np.random.normal(mm, math.sqrt(vv), 100)
testHistogram(x, mm, vv)

绘制下图:

enter image description here