使用Matplotlib根据下载的数据创建一个图表,展示两个不同地区的温度变化:阿拉斯加州锡特卡和加利福尼亚州死亡谷。
一、总体代码
import csv
from datetime import datetime
import matplotlib.pyplot as plt
# 导入数据文件
filename1 = 'chap16/sitka_weather_2021_full.csv'
filename2 = 'chap16/death_valley_2021_full.csv'
with open(filename1) as f:
reader = csv.reader(f)
header_row = next(reader)
print(header_row)
# 确定列索引
for index,column_header in enumerate(header_row):
print(index,column_header)
# 从文件中提取日期、温度PRCP
dates, tmaxs ,tmins = [], [], []
for row in reader:
date = datetime.strptime(row[2],'%Y-%m-%d')
try:
tmax = int(row[7])
tmin = int(row[8])
except ValueError:
print(f'{date}数据缺失!')
else:
tmaxs.append(tmax)
tmins.append(tmin)
dates.append(date)
# 绘制图形
plt.style.use('seaborn-v0_8')
fig, ax = plt.subplots()
ax.plot(dates, tmaxs, c='red',alpha=0.5)
ax.plot(dates, tmins, c='blue',alpha=0.5 ) # alpha 代表颜色
ax.fill_between(dates,tmaxs,tmins,facecolor='blue',alpha=0.1)
# 设置标签
ax.set_title('2021年温度',fontsize=24)
fig.autofmt_xdate()
ax.set_ylabel('temperature(F)')
ax.set_ylim(0, 110)
ax.tick_params(axis='both', labelcolor='b',labelsize='medium', width=3)
plt.show()
实现效果:
二、分部分说明
0、调用并读取文件、提取数据.
①模块csv 包含函数next() ,调用它并传入阅读器对象时,它将返回文件中的下一行。只调用了next() 一次,则得到文件第一行的列名。
②遍历文件中余下的各行:for row in reader:
with open(filename) as f:
reader = csv.reader(f)
header_row = next(reader)
print(header_row)
# 确定列索引
for index,column_header in enumerate(header_row):
print(index,column_header)
# 从文件中提取日期、温度
dates, tmaxs ,tmins = [], [], []
for row in reader:
date = datetime.strptime(row[2],'%Y-%m-%d')
try:
tmax = int(row[7])
tmin = int(row[8])
except ValueError:
print(f'{date}数据缺失!')
else:
tmaxs.append(tmax)
tmins.append(tmin)
dates.append(date)
1、绘制图形。
subplots函数可在一张图片中绘制一个或多个图表。变量fig 表示整张图片。变量ax表示图片中的各个图表。ax.plot代表绘制图标,调用两次代表在fig上绘制两张。
# 绘制图形
plt.style.use('seaborn-v0_8')
fig, ax = plt.subplots()
# 可以在一张图上绘制两条折线
ax.plot(dates, tmaxs, c='red',alpha=0.5)
ax.plot(dates, tmins, c='blue',alpha=0.5 ) # alpha 代表颜色
# 在两条线中填充
ax.fill_between(dates,tmaxs,tmins,facecolor='blue',alpha=0.1)
2、设置标签:使用ax.set_***命令。
ax.set_title('2017年每日降水量',fontsize=24)
ax.set_xlabel('')
fig.autofmt_xdate() // 设置倾斜
ax.set_ylabel('降水量(mm)')
ax.set_ylim(0, 2.5) //设置固定y刻度
4、更改刻度、刻度标签和网格线的外观:包括axis(应用参数的轴),labelcolor(标签颜色),labelsize(标签字体大小)。
ax.tick_params(axis='both', labelcolor='b',labelsize='medium', width=3)
附录:
0、必须把当前的图关掉才能继续画图。
1、使用with打开文件,并且将其内容存储为reader变量后,后续的操作需要在with底下(即缩进)
with open(filename) as f:
reader = csv.reader(f)
header_row = next(reader)
print(header_row)
# 从文件中提取日期、每日降水量PRCP
dates, PRCPs = [], []
for row in reader:
PRCP = float(row[5])
date = datetime.strptime(row[2],'%Y-%m-%d')
PRCPs.append(PRCP)
dates.append(date)
2、index()方法返回列表中特定元素的索引。
# 例如
animals = ['cat', 'dog', 'mouse', 'elephant']
animals.index('dog')
# 定义
date_index = header_row.index('DATE')
high_index = header_row.index('TMAX')
low_index = header_row.index('TMIN')
name_index = header_row.index('NAME')
3、try-except代码块:即便出现异常,程序也将继续运行:显示你编写的友好的错误消息,而不是令用户迷惑的traceback。例如以下代码:当第二个数为0时,输出提示性信息,并且再次循环运行程序。

也可以使用continue 来跳过一些数据,或者使用remove() 或del 将已提取的数据删除。
学习参考:
《Python编程:从入门到实践(第2版)》 ([美]埃里克·马瑟斯(Eric Matthes))
章节:16.1