溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

談?wù)凱ython實(shí)戰(zhàn)數(shù)據(jù)可視化之matplotlib模塊(實(shí)戰(zhàn)篇)

發(fā)布時(shí)間:2020-07-28 18:57:50 來(lái)源:網(wǎng)絡(luò) 閱讀:7330 作者:CFishHome 欄目:編程語(yǔ)言

前沿

通過(guò)上一篇談?wù)凱ython實(shí)戰(zhàn)數(shù)據(jù)可視化之matplotlib模塊(基礎(chǔ)篇)的學(xué)習(xí),我們初步了解了matplotlib模塊的pyplot基礎(chǔ),本節(jié)實(shí)戰(zhàn)將利用CSV模塊獲取某地的天氣數(shù)據(jù),并且使用matplotlib模塊將天氣數(shù)據(jù)可視化。

配套資源

鑒于Python編程從入門到實(shí)戰(zhàn)這本書的配套資源網(wǎng)上難找的悲傷,我深有體會(huì)。所以,在此提供鏈接供下載(有幫助點(diǎn)個(gè)贊支持下我哦(●'?'●)):
百度云鏈接:https://pan.baidu.com/s/1-XE0pBS8IaDLoUBdO8hDOw 密碼:n39g

CSV文件格式

CSV - 逗號(hào)分隔值文件格式,逗號(hào)分隔值(Comma-Separated Values,CSV,有時(shí)也稱為字符分隔值,因?yàn)榉指糇址部梢圆皇嵌禾?hào)),其文件以純文本形式存儲(chǔ)表格數(shù)據(jù)(數(shù)字和文本)。純文本意味著該文件是一個(gè)字符序列,不含必須像二進(jìn)制數(shù)字那樣被解讀的數(shù)據(jù)。CSV文件由任意數(shù)目的記錄組成,記錄間以某種換行符分隔;每條記錄由字段組成,字段間的分隔符是其它字符或字符串,最常見(jiàn)的是逗號(hào)或制表符。通常,所有記錄都有完全相同的字段序列。通常都是純文本文件。
例如:

Country,Indicator,Year,Value
AFG,NGDP_R,2002,183.26
AFG,NGDP_R,2003,198.736
AFG,NGDP_R,2004,200.069
AFG,NGDP_R,2005,223.737
AFG,NGDP_R,2006,235.731
AFG,NGDP_R,2007,267.177
AFG,NGDP_R,2008,277.498
AFG,NGDP_R,2009,334.621
AFG,NGDP_R,2010,362.857
AFG,NGDP_R,2011,386.368
AFG,NGDP_R,2012,440.336
AFG,NGDP_R,2013,456.453
.......................
.......................

利用CSV模塊獲取天氣數(shù)據(jù)

先將sitka_weather_07-2014.csv文件放到項(xiàng)目同一目錄下,然后利用Python標(biāo)準(zhǔn)庫(kù)提供的CSV模塊可以用于分析CSV文件中的數(shù)據(jù)行(也就是上面提到的記錄),讓我們能快速提取感興趣的值。案例代碼如下:

import csv

# 包含一個(gè)sitka城市七月份天氣信息的CSV文件,里面都是用逗號(hào)隔開(kāi)
filename = 'sitka_weather_07-2014.csv'

# 打開(kāi)csv文件,實(shí)例化一個(gè)csv模塊的reader閱讀器對(duì)象,是一個(gè)可迭代對(duì)象,所以可以使用for循環(huán)遍歷該reader閱讀器對(duì)象,
# 也可以調(diào)用BIF-next函數(shù)遍歷下一行,需要注意的是reader里面的每行記錄只能被遍歷一次,其中reader有一個(gè)line_num屬性返回遍歷過(guò)程中對(duì)應(yīng)的行號(hào)。
with open(filename) as f:
    reader = csv.reader(f)  # 返回的是一個(gè)csv的閱讀器對(duì)象,直接打印獲取不到里面的內(nèi)容
    print(reader)  # 打印出的是<_csv.reader object at 0x000002D1B24912B8>
    head_row = next(reader)  # 返回第一行的記錄內(nèi)容組成的字符串列表
    print(head_row)  # 打印 ['AKDT', 'Max TemperatureF'...]
    for row in reader:
        # 根據(jù)閱讀器對(duì)象的記錄(一行算一個(gè)記錄)只能遍歷一次的特性,行號(hào)從2開(kāi)始了哦
        print(reader.line_num, row)  # 打印 2 ['2014-7-1', '64', '56', '50'....]

運(yùn)行結(jié)果如下:
談?wù)凱ython實(shí)戰(zhàn)數(shù)據(jù)可視化之matplotlib模塊(實(shí)戰(zhàn)篇)
好了,初步獲取到了CSV文件的內(nèi)容,但是我們有一點(diǎn)要注意,就是reader里面的每行記錄只能被遍歷一次,我們下面添加一行代碼更深刻領(lǐng)會(huì):

import csv

filename = 'sitka_weather_07-2014.csv'

with open(filename) as f:
    reader = csv.reader(f)
    print(reader)
    print(list(reader))  # 值得注意的是,當(dāng)先調(diào)用 print(list(reader)),發(fā)現(xiàn)遍歷到最后了,再執(zhí)行后面的代碼就報(bào)錯(cuò)了
    head_row = next(reader)
    print(head_row)
    for row in reader:
        print(reader.line_num, row)

運(yùn)行結(jié)果如下:
談?wù)凱ython實(shí)戰(zhàn)數(shù)據(jù)可視化之matplotlib模塊(實(shí)戰(zhàn)篇)
對(duì)上面的結(jié)果進(jìn)行分析:對(duì)于list內(nèi)置函數(shù),內(nèi)部實(shí)現(xiàn)大概可以猜到是先將reader對(duì)象里面的記錄遍歷再添加進(jìn)一個(gè)列表中,然后返回整個(gè)列表。調(diào)用list內(nèi)置函數(shù)其實(shí)已經(jīng)遍歷一次了,遍歷指針指向了最后一個(gè)記錄,并且因?yàn)閞eader的記錄(一行算一個(gè)記錄)只能被遍歷一次的特性,所以后面的代碼再遍歷reader對(duì)象就沒(méi)啥意義了。

繪制阿拉斯加錫特卡2014年7月每日最高氣溫折線圖

我們前面已經(jīng)知道怎么獲取天氣數(shù)據(jù)了,那么我們將使用pyplot模塊繪制阿拉斯加錫特卡2014年7月每日最高氣溫折線圖。代碼如下(注釋有助于理解代碼):

# 繪制錫特卡7月份的天氣數(shù)據(jù)
# 導(dǎo)入python支持的csv模塊,用來(lái)處理csv文件,分析csv文件中的數(shù)據(jù)行,讓我們提取我們感興趣的值
import csv
# 導(dǎo)入matplotlib包里的pyplot模塊,用于可視化獲取到的每天最高溫度
from matplotlib import pyplot as plt

from datetime import datetime

# 包含一個(gè)城市天氣信息的CSV文件,里面都是用逗號(hào)隔開(kāi)
filename = 'sitka_weather_07-2014.csv'

# 打開(kāi)csv文件,實(shí)例化一個(gè)csv模塊的reader閱讀器對(duì)象
with open(filename) as f:
    reader = csv.reader(f)
    head_row = next(reader)  # 返回第一行的記錄內(nèi)容組成的字符串列表,例如:['1','2'....]
    highs = []  # 用于存儲(chǔ)每天最高的溫度
    dates = []  # 用于存儲(chǔ)日期
    for row in reader:  # row也是返回遍歷行的記錄內(nèi)容組成的字符串列表
        current_date = datetime.strptime(row[0], "%Y-%m-%d")  # 講時(shí)間字符串轉(zhuǎn)化為指定格式的datetime對(duì)象
        dates.append(current_date)
        high = int(row[1])  # 由于前面已經(jīng)next過(guò)一次了,根據(jù)reader只能被遍歷一次的性質(zhì),這里for循環(huán)就從第二行開(kāi)始遍歷
        highs.append(high)  # 將每天的最高溫度保存在highs列表中,這時(shí)候列表存儲(chǔ)的元素都是數(shù)字而非字符串,那么我們就可以利用這個(gè)列表進(jìn)行可視化處理了
fig = plt.figure(dpi=128, figsize=(10, 6))
plt.plot(dates, highs, c='red')
plt.title("Daily high temperatures,July 2014", fontsize=24)
plt.xlabel('', fontsize=16)
fig.autofmt_xdate()  # 繪制傾斜的日期標(biāo)簽
plt.ylabel("Temperature (F)", fontsize=16)
plt.tick_params(axis='both', which='major', labelsize=14)
plt.show()

運(yùn)行結(jié)果如下:
談?wù)凱ython實(shí)戰(zhàn)數(shù)據(jù)可視化之matplotlib模塊(實(shí)戰(zhàn)篇)
仔細(xì)觀察上面的運(yùn)行結(jié)果,X軸還是與書本圖片有些出入,其實(shí)無(wú)礙,這是正確的,因?yàn)槲覀冞\(yùn)行的結(jié)果也是7月初開(kāi)始,只不過(guò)X軸把6月份也包括進(jìn)去了。

繪制阿拉斯加錫特卡2014年每日最高氣溫和最低氣溫折線圖

前面我們繪制了阿拉斯加錫特卡7月份每日最高氣溫折線圖,現(xiàn)在我們將獲取阿拉斯加錫特卡2014年整一年的天氣數(shù)據(jù),再繪制阿拉斯加錫特卡2014年每日最高氣溫和最低氣溫折線圖。我們先將sitka_weather_2014.csv文件也放到項(xiàng)目同一目錄下。代碼如下:

# 繪制錫特卡整年的天氣數(shù)據(jù),未進(jìn)行錯(cuò)誤檢查
# 導(dǎo)入python支持的csv模塊,用來(lái)處理csv文件,分析csv文件中的數(shù)據(jù)行,讓我們提取我們感興趣的值
import csv
# 導(dǎo)入matplotlib包里的pyplot模塊,用于可視化獲取到的每天最高溫度
from matplotlib import pyplot as plt

from datetime import datetime

# 包含一個(gè)城市天氣信息的CSV文件,里面都是用逗號(hào)隔開(kāi)
filename = 'sitka_weather_2014.csv'

# 打開(kāi)csv文件,實(shí)例化一個(gè)csv模塊的reader閱讀器對(duì)象
with open(filename) as f:
    reader = csv.reader(f)
    head_row = next(reader)  # 返回第一行的記錄內(nèi)容組成的字符串列表,例如:['1','2'....]
    highs = []  # 用于存儲(chǔ)整年每一天中的最高溫度
    dates = []  # 用于存儲(chǔ)日期
    lows = []  # 用于存儲(chǔ)整年每一天中的最低溫度
    for row in reader:  # row也是返回遍歷行的元素內(nèi)容組成的字符串列表
        current_date = datetime.strptime(row[0], "%Y-%m-%d")
        dates.append(current_date)
        high = int(row[1])  # 由于前面已經(jīng)next過(guò)一次了,根據(jù)reader只能被遍歷一次的性質(zhì),這里for循環(huán)就從第二行開(kāi)始遍歷
        highs.append(high)  # 將每天的最高溫度保存在highs列表中,這時(shí)候列表存儲(chǔ)的元素都是數(shù)字而非字符串,那么我們就可以利用這個(gè)列表進(jìn)行可視化處理了
        low = int(row[3])
        lows.append(low)
fig = plt.figure(dpi=128, figsize=(10, 6))
plt.plot(dates, highs, c='red', alpha=0.5)  # 繪制整年每一天的最高氣溫折線圖
plt.plot(dates, lows, c='blue', alpha=0.5)  # 繪制整年每一天的最低氣溫折線圖
plt.fill_between(dates, highs, lows, facecolor='blue', alpha=0.1)  # 填充每日最高氣溫和最低氣溫之間的區(qū)域
plt.title("Daily high and low temperatures,- 2014", fontsize=24)
plt.xlabel('', fontsize=16)
fig.autofmt_xdate()
plt.ylabel("Temperature (F)", fontsize=16)
plt.tick_params(axis='both', which='major', labelsize=14)
plt.show()

運(yùn)行結(jié)果如下:
談?wù)凱ython實(shí)戰(zhàn)數(shù)據(jù)可視化之matplotlib模塊(實(shí)戰(zhàn)篇)
由于有些氣象站會(huì)偶爾出現(xiàn)故障,未能收集全應(yīng)該收集的數(shù)據(jù),所以如果我們還是采用上一個(gè)代碼例子這樣獲取某個(gè)城市的天氣數(shù)據(jù),那么就會(huì)報(bào)錯(cuò),因?yàn)檫@個(gè)城市的csv文件中某一天可能是缺少數(shù)據(jù)的,所以會(huì)報(bào)ValueError錯(cuò)誤。就如下圖這樣缺少某天的數(shù)據(jù):
談?wù)凱ython實(shí)戰(zhàn)數(shù)據(jù)可視化之matplotlib模塊(實(shí)戰(zhàn)篇)
所以,鑒于上面的問(wèn)題,下一節(jié)獲取死亡谷整年的天氣數(shù)據(jù)將會(huì)采用異常處理機(jī)制就能預(yù)防這種情況。

繪制死亡谷2014年每日最高氣溫和最低氣溫折線圖

前面說(shuō)了可能在實(shí)際應(yīng)用中可能會(huì)出現(xiàn)缺少數(shù)據(jù)等問(wèn)題,作為一名程序開(kāi)發(fā)者,必須設(shè)想到各種可能出現(xiàn)的問(wèn)題,并且采用實(shí)用的方法解決問(wèn)題。我們將會(huì)采用異常處理機(jī)制來(lái)繪制死亡谷2014年每日最高氣溫和最低氣溫折線圖。代碼如下:

# 導(dǎo)入python支持的csv模塊,用來(lái)處理csv文件,分析csv文件中的數(shù)據(jù)行,讓我們提取我們感興趣的值
import csv
# 導(dǎo)入matplotlib包里的pyplot模塊,用于可視化獲取到的每天最高溫度
from matplotlib import pyplot as plt

from datetime import datetime

# 包含一個(gè)城市天氣信息的CSV文件
filename = 'death_valley_2014.csv'

# 打開(kāi)csv文件,實(shí)例化一個(gè)csv模塊的reader閱讀器對(duì)象
with open(filename) as f:
    reader = csv.reader(f)
    head_row = next(reader)  # 返回第一行的記錄內(nèi)容組成的字符串列表,例如:['1','2'....]
    highs = []  # 用于存儲(chǔ)每天最高的溫度
    dates = []  # 用于存儲(chǔ)日期
    lows = []  # 用于存儲(chǔ)每天最低的溫度
    for row in reader:  # row也是返回遍歷行的記錄內(nèi)容組成的字符串列表
        try:
            current_date = datetime.strptime(row[0], "%Y-%m-%d")
            high = int(row[1])  # 由于前面已經(jīng)next過(guò)一次了,根據(jù)reader只能被遍歷一次的性質(zhì),這里for循環(huán)就從第二行開(kāi)始遍歷
            low = int(row[3])
        except ValueError:
            print(current_date,'missing data')
        else:
            dates.append(current_date)
            highs.append(high)  # 將每天的最高溫度保存在highs列表中,這時(shí)候列表存儲(chǔ)的元素都是數(shù)字而非字符串,那么我們就可以利用這個(gè)列表進(jìn)行可視化處理了
            lows.append(low)
fig = plt.figure(dpi=128, figsize=(10, 6))
plt.plot(dates, highs, c='red',alpha=0.5)
plt.plot(dates, lows, c='blue',alpha=0.5)
plt.fill_between(dates,highs,lows,facecolor='blue',alpha=0.1)
plt.title("Daily high and low temperatures,- 2014\nDeath Valley.CA", fontsize=20)
plt.xlabel('', fontsize=16)
fig.autofmt_xdate()
plt.ylabel("Temperature (F)", fontsize=16)
plt.tick_params(axis='both', which='major', labelsize=14)
plt.show()

運(yùn)行結(jié)果如下(兩張圖):
(1)折線圖
談?wù)凱ython實(shí)戰(zhàn)數(shù)據(jù)可視化之matplotlib模塊(實(shí)戰(zhàn)篇)
(2)終端圖
談?wù)凱ython實(shí)戰(zhàn)數(shù)據(jù)可視化之matplotlib模塊(實(shí)戰(zhàn)篇)
通過(guò)上面兩個(gè)圖可以知道,2014-02-16這一天的溫度數(shù)據(jù)是丟失了,所以在折線圖其實(shí)沒(méi)有畫出2014-02-16這一天的最高和最低氣溫(由于太密集看不出)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI