北京气温咋样 - Python,数据绘图,matplotlib

matplotlib 是最流行的 python 绘图包之一,相比起之前给大家介绍的小清新 pygal,matplotlib 显得比较偏理工。具体安装使用请参考官方文档。今天小狼要给大家举的栗子很简单:绘制一个折线图看看帝都的气温变化情况。源码请移步小狼 GitHub 下的 bj_tmp_matplotlib 文件夹。

巧妇难为无米之炊,第一步就是找数据。这里我们使用的天气数据来自于 Weather Underground。无需注册你就可以下载有记录的年份的全球各地天气数据,如果注册的话则可以得到一个 API,你也可以利用 API 来获取数据。我们需要获取北京 2016 年全年的气温数据,以此来绘制全年的高低气温走势图。该网站的数据显示非常清晰友好,由于我们需要的数据也不多,直接转存成 .csv 格式备用。

接下来开写代码,首先导入一些我们要用到的包,用来支持 .csv 文件处理和时间数据处理:

import csv
import matplotlib.dates
from datetime import datetime
from matplotlib import pyplot as plt

写一个函数来把时间数据存储到列表里,并且转换成可被 python 理解的时间格式:

def date_to_list(data_index):
    """ save date to a list """
    results = []
    for row in data:
        results.append(datetime.strptime(row[data_index], '%Y-%m-%d'))
    return results

再来一个函数用来存储气温数据:

def data_to_list(data_index):
    """ save data to a list """
    results = []
    for row in data:
        results.append(int(row[data_index]))
    return results

现在看一下那个 .csv 文件的构造和内容:

filename = 'beijing_2016.csv'
with open(filename) as bj:
    data = csv.reader(bj)
    header = next(data)

    print(header)
    print(next(data))

通过两个 print 语句我们得到如下结果:

['date_akdt', 'high_temp_f', 'avg_temp_f', 'low_temp_f', 'high_dew_point_f', 'avg_dew_point_f', 'low_dew_point_f', 'high_humidity_pct', 'avg_humidity_pct', 'low_humidity_pct', 'high_sea_level_press_in', 'avg_sea_level_press_in', 'low_sea_level_press_in', 'high_visibility_mi', 'avg_visibility_mi', 'low_visibility_mi', 'high_wind_mph', 'avg_wind_mph', 'high_wind_mph', 'sum_precip_in', 'events']
['2016-01-01', '41', '30', '19', '23', '18', '14', '86', '68', '25', '30.36', '30.23', '30.12', '4', '3', '1', '9', '3', '-', '0', '']

上面的输出分别是表头和第一行数据的内容,我们可以看到其中有我们需要的时间,最高温度和最低温度,分别对应的 index 是 0,1,3。当然,你也可以直接用代码获取 index,尤其是当数据类型非常多的时候:

    print('date_akdt', header.index('date_akdt'))
    print('high_temp_f', header.index('high_temp_f'))
    print('low_temp_f', header.index('low_temp_f'))

获得输出:

date_akdt 0
high_temp_f 1
low_temp_f 3

知道数据位置后,我们就可以单独提取这些数据存到列表里,用于之后的绘图。这里有个坑,因为我们读取 .csv 文件的时候用到了迭代器,所以我们需要先转存一下数据,否则仅能返回第一条数据,其余的则返回空值。

    data = list(data)

接下来就是把数据存到列表里,由于获取的温度是华氏度,所以温度这里加了一个转换过程 (x-32)/1.8

    high_temp_f_bj = data_to_list(1)
    high_temp_c_bj = [int((x-32)/1.8) for x in high_temp_f_bj]

    low_temp_f_bj = data_to_list(3)
    low_temp_c_bj = [int((x-32)/1.8) for x in low_temp_f_bj]

    date = date_to_list(0)

然后就到了绘图步骤,先绘制高温曲线看一下:

    plt.plot(date, high_temp_c_bj)
    plt.show()

我们得到一个酱紫的图,不错哦:

bj_temp_2016_high.png

把低温曲线也加进去:

    plt.plot(date, low_temp_c_bj)
bj_temp_2016.png

做一些显示上的优化(咋就这么这么这么麻烦呢!):

    plt.figure(figsize=(15, 5), dpi=100)
    plt.plot(date, high_temp_c_bj, c='xkcd:orange')
    plt.plot(date, low_temp_c_bj,c='xkcd:azure')

    plt.title('Beijing Temperatures (High & Low) - Year 2016', fontsize=22)
    plt.ylabel('Temperature (C)', fontsize=20)
    plt.tick_params(axis='both', labelsize=16)
    plt.fill_between(date, high_temp_c_bj, low_temp_c_bj, facecolor='xkcd:tan', alpha=0.2)

    plt.gca().xaxis.set_major_formatter(matplotlib.dates.DateFormatter("%Y-%m"))
    plt.gcf().autofmt_xdate()
    plt.margins(x=0,y=0.2)

    plt.show()

上面的代码中,figure() 可调整绘图大小和分辨率,fill_between() 可在两条折线中间绘制填充色,autofmt_xdate() 可将横坐标斜着显示以避免重叠,margins() 可设置坐标轴和边框的留白距离。

bj_temp_2016_final.png

至此,总算是差不多了。其实用 matplotlib 绘制类似这样的图是比较基础的,但是我们可以看到稍有不慎在数据处理上还是有坑的,包括最后的 x 轴坐标调整也费了小狼一些时间去研究,幸好过程中得到几位大牛的指(教)点(训)。此外,在写提取数据的代码时,如果对数据质量没有把握,还是最好加入 try - except - else 模块方为妥当。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容