使用列表理解绘制存储在dicts列表中的数据

2024-10-01 09:35:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个netCDF文件,其中包含1948年以来全球的月平均气温。对于作业,我必须选择任何一个提供的数据点,提取其12月、1月、2月和3月的平均温度值,然后显示它。在

我已经将数据解包,并将其收集到字典列表中,如下所示:

12月

decemberMeans = [
    {'year': 1948, 'temp': 271.24}, {'year': 1949, 'temp': 271.28},
    {'year': 1950, 'temp': 268.52}, {'year': 1951, 'temp': 269.63},
    ...,
    {'year': 2015, 'temp': 277.23}, {'year': 2016, 'temp': 271.25}
]

与1月、2月和3月对应的数据结构相同。在

我的下一步就是把它画出来。我必须为每一组数据在同一个图上画一条线,我使用列表理解来完成。现在我的绘图代码如下:

^{pr2}$

它的情节很好,但是我可以看到我所有的列表理解都是多余的。有没有一种方法可以在一次foll-swoop中解压字典值,这样我就不必为每个集合编写data['...'] for data in list两次?在


另外,在我写这篇文章的时候,我开始意识到我可以编写一个函数来完成绘图(这可能比写这篇文章花的时间还要少),但我还是很想知道。提前感谢大家!在


Tags: 文件数据绘图列表data字典作业netcdf
2条回答

是的pandas绝对是一条路!请看一下示例here(如果您可以以该形式获取数据,第二个示例应该正是您想要的)。不过,一般来说,你可以做一些事情来避免你遇到的那种重复。在

为常用代码编写函数是一个很好的开始。听起来你已经想出了这样的办法:

def myplot(monthMeans, marker):
    plt.plot([data['years'] for data in monthMeans],
             [data['temp'] for data in monthMeans],
             marker)

然后将每个序列绘制到活动图形的代码变成:

^{pr2}$

但这仍然不理想-如果您更改了myplot的名称并必须更改每一行怎么办?您可以再次缩短内容,因为Python允许您创建任何内容的列表:

allMonthMeans = [decemberMeans, januaryMeans, ...]
markers = ['k-', 'r-', ...]

# 'zip' loops over the two lists simultaneously
for monthMeans, marker in zip(allMonthMeans, markers):
    myplot(monthMeans, marker)

您可以使用pandas来完成此操作:

import matplotlib.pyplot as plt
import pandas as pd

decemberMeans = [
    {'year': 1948, 'temp': 271.24}, {'year': 1949, 'temp': 271.28},
    {'year': 1950, 'temp': 268.52}, {'year': 1951, 'temp': 269.63},
    {'year': 2015, 'temp': 277.23}, {'year': 2016, 'temp': 271.25}
]  
df = pd.DataFrame(decemberMeans)

plt.figure(1)
plt.plot(df['year'], df['temp'], 'k-')

相关问题 更多 >