如何使用值列表在 MatPlotLib 中的直方图上设置 bin 范围?

问题描述 投票:0回答:1

我有两个具有相应值的列表,例如:[A,B,C]和[d,e,f],其中A,B和C是日期时间对象,d,e和f是浮点对象,“d” " 是出现在“A”上的值。我有另一个日期时间对象列表,可以将其分入 A、B 和 C 范围,但我想将它们分入相应的 d、e 和 f 值。

我的代码现在看起来像这样:

import csv
import matplotlib.pyplot as plt
import datetime

list1 = []
zip1 = []
zip2 = []

#opening files and setting lists as csv inputs
with open("whistles.csv") as whistlecsv:
    whistlelist = csv.reader(whistlecsv, delimiter = ',')
    for row in whistlelist:
        list1.append(row[0])
with open("f10.7.csv") as fcsv:
    flist = csv.reader(fcsv, delimiter = ',')
    for row in flist:
        zip2.append(float(row[1]))
        zip1.append(row[0])

#converting strings to datetime objects
for i in range(0, len(list1)):
    list1[i] = datetime.datetime.strptime(list1[i], "%Y-%m-%d %H:%M:%S")
for i in range(0, len(zip1)):
    zip1[i] = datetime.datetime.strptime(zip1[i], "%Y%m%d %H%M%S")

#binning list1 into zip2 using corresponding zip1
for i in range(0, len(list1)):
    for j in range(0, len(zip1)):
        if int(datetime.datetime.strftime(zip1[j-1], "%Y%m%d%H%M%S")) < int(datetime.datetime.strftime(list1[i], "%Y%m%d%H%M%S")) < int(datetime.datetime.strftime(zip1[j], "%Y%m%d%H%M%S")):
        zip2[j-1].append(list1[i])

plt.hist(list1, bins = zip2)
plt.show()

这将返回“AttributeError:'float'对象没有属性'append'” 我想计算 list1 的元素出现在 zip1 中的元素指定的一组值范围内的次数,并绘制一个频率直方图,将该计数映射到 zip2 的相应值。我怎么做?这主要涉及最后一段代码。

我尝试压缩列表 zip1 和 zip2,为每个日期设置特定的浮点值,然后使用 plt.hist() 函数通过 zip2 对 list1 数据进行装箱:

matched = zip(zip1, zip2)
*zip1, *zip2 = zip(*matched)

plt.hist(list1, bins = *zip2)
plt.show()

我知道这基本上只是压缩和解压缩文件,但我已经没有主意了。我试图表明 zip1 和 zip2 是对应的值,因此我基本上应该能够通过任一列表对 list1 进行分类以生成频率直方图,但事实并非如此。

plt.hist() 函数返回一个错误,指出当我尝试按 zip2 值对 list1 数据进行装箱时,即使在压缩 zip1 和 zip2 文件之后,也无法生成简单的形状。

请帮忙!预先感谢。

python matplotlib histogram
1个回答
0
投票

如果我已经理解了这个问题,您可以在两个日期时间列表上使用

numpy.histogram
来计算每个容器中的数字,然后使用
stairs
根据浮点值绘制这些数字。

import datetime

import numpy as np
import matplotlib.pyplot as plt

dates = [datetime.datetime(2024, 1, d) for d in range(1, 32)]

date_bins = [datetime.datetime(2024, 1, 1), datetime.datetime(2024, 1, 12),
             datetime.datetime(2024, 2, 1)]
float_bins = [3, 27, 42]

counts, _ = np.histogram(dates, bins=date_bins)

fig, ax = plt.subplots()    
ax.stairs(counts, float_bins, fill=True)
ax.set_xticks(float_bins)
plt.show()

© www.soinside.com 2019 - 2024. All rights reserved.