【问题标题】:Problem in plotting n gaussian curves for n consecutive days连续 n 天绘制 n 条高斯曲线的问题
【发布时间】:2019-08-07 20:53:09
【问题描述】:

我正在尝试连续 n 天绘制 n 条高斯曲线。情节必须从用户输入的base 值开始,在 46800 秒(13:00 或下午 1 点)达到peak 值,并在一天结束时再次以接近base 值结束在接下来的 n 天里,必须复制相同的曲线。我正在听从这篇文章的建议:Generating multiple gaussian plots

我有以下代码:

import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as stats
import math
import pandas as pd
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()
from datetime import datetime

def date_inputs(start_date, end_date):
    try:
        start_date = datetime.strptime(start_date, '%Y-%m-%d %H:%M:%S')
        end_date = datetime.strptime(end_date, '%Y-%m-%d %H:%M:%S')
        dates = pd.date_range(start_date, end_date, freq = 'S').tolist()
        dates = pd.Series(dates)
        dates_diff = abs((end_date - start_date).days)
        dates = dates.iloc[:-1]
        print('Dates accepted!')
        return dates, dates_diff
    except ValueError:
        raise ValueError("Incorrect date format, should be YYYY-MM-DD HH:MM:SS")

start_date_input = str(input('Enter start date in %Y-%m-%d %H:%M:%S format: '))
end_date_input = str(input('Enter end date in %Y-%m-%d %H:%M:%S format: '))
dates, n = date_inputs(start_date_input, end_date_input)

def bell_curve(total_consumption, peak, base, n):
    x = np.linspace(0, n*86400, n*86400)
    sigma = total_consumption/(math.sqrt(2*math.pi)*(peak-base))
    sigmas = [sigma]*n
    pdf_value = np.zeros(x.shape)
    for m, s in zip(mus, sigmas):
        pdf_value += stats.norm.pdf(x,m,s)
    plt.figure(figsize = (20,10))
    plt.plot(dates, (total_consumption*pdf_value) + base)
    plt.xticks(rotation = 70)
    plt.show()
    return pdf_value

mu = 46800
seconds_in_one_day = 86400
mus = []
for i in range(0,n):
    mus.append(mu+(i*seconds_in_one_day))


peak = float(input('Enter the peak value in Watts:'))
total_consumption = float(input('Enter the total consumption in one day in Watts:'))
base = float(input('Enter the base value in Watts:'))

pdf_values = bell_curve(total_consumption, peak, base, n)

当我给出如下输入时:

start_day: 2018-01-01 00:00:00,end_day: 2018-01-02 00:00:00 与 peak 为 2222,base 为 500 和 total_consumption 为 630000000,我得到下图:

图 1

上面的图表是一天的,是正确的。

当我将结束日期更改为end_day: 2018-01-03 00:00:00 时,开始日期和结束日期之间的差异为 2,因此我希望将 2 个相同的图表并排绘制,具有相同的峰值、相同的基值和峰​​值出现在13:00 或次日下午 1 点:

图 2:2 天高斯曲线的示例

但与图 2 不同的是,该图如下所示:

图 3

在图 3 中,我们可以看到绘制的不是 2 个图,而是一个图,其峰值和基值完全错误。

谁能告诉我这里的代码有什么错误?

谢谢

【问题讨论】:

  • 您已经将 2 天范围标准化。当您对图表进行归一化时,曲线下的面积必须等于 1。
  • 嘿@AnnaNevison,你能告诉我代码中的问题在哪里吗?

标签: python python-3.x matplotlib logic gaussian


【解决方案1】:

您的sigma 值太大。我不知道您要计算什么,所以我无法帮助您计算该值,但这是手动将 bell_curve() 中的值更改为 sigma = 10000 时代码的输出:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 2012-03-02
    • 1970-01-01
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 2014-11-14
    相关资源
    最近更新 更多