数据:
链接: https://pan.baidu.com/s/1XuDQqPq3O1zgHsia29qBnw 提取码: nrhv
这是阿拉斯加州SITKA地区2018年天气数据
绘制2018年最低最高气温图形:
code
# -*- coding:utf-8 -*-
import csv
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
from matplotlib.pyplot import MultipleLocator
from datetime import datetime
import pandas as pd
df = pd.read_csv("D:\python39\my\data\procrank.txt",delimiter="\s+")
df.to_csv("D:\python39\my\data\procrank.csv", encoding='utf-8', index=False)
filename = 'D:\python39\my\data\sitka_weather_2018_simple.csv'
with open(filename) as f:
reader = csv.reader(f)
header_row = next(reader)
#print(header_row)
dates,highs,lows = [],[],[]
for row in reader:
current_date = datetime.strptime(row[2],'%Y-%m-%d')
high = int(row[5])
highs.append(high)
low = int(row[6])
lows.append(low)
dates.append(current_date)
#print(highs)
myfont = fm.FontProperties(fname=r'C:\Windows\Fonts\msyh.ttc')#设置字体
#根据最高温度绘制图形
plt.style.use('seaborn')
fig, ax = plt.subplots()
ax.plot(dates,highs,c='red')
ax.plot(dates,lows, c='blue')
#设置图形格式
ax.set_title("2018年每日最高温度",fontproperties=myfont,fontsize=24)
ax.set_xlabel('',fontproperties=myfont,fontsize=16)
fig.autofmt_xdate()
ax.set_ylabel("温度(F)",fontproperties=myfont,fontsize=16)
ax.tick_params(axis='both',which='major',labelsize=16)
#plt.savefig('D:\python39\my\data\F.png')#保存为png格式
plt.show()
解析:
1.header_row = next(reader)#得到文件第一行
2.for row in reader:
high = int(row[5])
阅读器对象从其停留的地方往下读取csv文件 ,每次都自动返回当前位置所在的下一行。由于阅读器已经读取了文件头:header_row = next(reader),这个循环将从第二行开始
3.current_date = datetime.strptime(row[2],’%Y-%m-%d’)
#%Y-%m-%d格式需与表格一致,若表格显示2018/07/07,则需要写成%Y/%m/%d
4.设置图像字体:
myfont = fm.FontProperties(fname=r’C:\Windows\Fonts\msyh.ttc’)#设置字体
Fonts文件夹中字体名与显示的不一致,将字体文件复制粘贴到其他地方,可检查实际的文件名
结果
扩展
1.更新横纵坐标间距
有时候为了更放便于数据分析,想改变默认的坐标间隔,可使用以下方法:
ax.set_ylabel("温度(F)",fontproperties=myfont,fontsize=16)
ax.tick_params(axis='both',which='major',labelsize=16)
#设置图形格式:横坐标2018/01/01~2018/12/31,间隔为30;纵坐标0~70,间隔为5
x_major_locator = MultipleLocator(30)
# 把x轴的刻度间隔设置为30,并存在变量里
y_major_locator = MultipleLocator(5)
# 把y轴的刻度间隔设置为5,并存在变量里
ax = plt.gca()
# ax为两条坐标轴的实例
ax.xaxis.set_major_locator(x_major_locator)
# 把x轴的主刻度设置为1的倍数
ax.yaxis.set_major_locator(y_major_locator)
plt.show()
更新后:
2.更新横纵坐标取值区间
发现上述表格上下左右拖拽,但无数据,是空白区域,为使图像可读性更强,使用限制横纵坐标的区间
方法:ax.set_ylim(起始,末尾),ax.set_xlim(起始,末尾)
#设置图形格式:横坐标2017/12/28~2019/01/03,间隔为30;纵坐标0~70,间隔为5
ax.set_ylim(10, 70)
date_start = datetime(2017,12,28)
date_end = datetime(2019, 1, 3)
ax.set_xlim(date_start, date_end)
x_major_locator = MultipleLocator(30)
# 把x轴的刻度间隔设置为30,并存在变量里
y_major_locator = MultipleLocator(5)
# 把y轴的刻度间隔设置为5,并存在变量里
ax = plt.gca()
# ax为两条坐标轴的实例
ax.xaxis.set_major_locator(x_major_locator)
# 把x轴的主刻度设置为1的倍数
ax.yaxis.set_major_locator(y_major_locator)
注意!!!!!
以上是基于python3.0实现的
转换到2.0时提示错误:ValueError: matplotlib display text must have all code points < 128 or use Unicode strings
这是由于包含中文字符,需要更改字符编码:在中文字符前加上u
ax.set_ylabel(u"温度(F)",fontproperties=myfont,fontsize=16)