談談Python實戰數據可視化之matplotlib模塊(實戰篇)

前沿

通過上一篇談談Python實戰數據可視化之matplotlib模塊(基礎篇)的學習,我們初步瞭解了matplotlib模塊的pyplot基礎,本節實戰將利用CSV模塊獲取某地的天氣數據,並且使用matplotlib模塊將天氣數據可視化。

配套資源

鑑於Python編程從入門到實戰這本書的配套資源網上難找的悲傷,我深有體會。所以,在此提供鏈接供下載(有幫助點個贊支持下我哦(●'◡'●)):
百度雲鏈接:https://pan.baidu.com/s/1-XE0pBS8IaDLoUBdO8hDOw 密碼:n39g

CSV文件格式

CSV - 逗號分隔值文件格式,逗號分隔值(Comma-Separated Values,CSV,有時也稱爲字符分隔值,因爲分隔字符也可以不是逗號),其文件以純文本形式存儲表格數據(數字和文本)。純文本意味着該文件是一個字符序列,不含必須像二進制數字那樣被解讀的數據。CSV文件由任意數目的記錄組成,記錄間以某種換行符分隔;每條記錄由字段組成,字段間的分隔符是其它字符或字符串,最常見的是逗號或製表符。通常,所有記錄都有完全相同的字段序列。通常都是純文本文件。
例如:

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模塊獲取天氣數據

先將sitka_weather_07-2014.csv文件放到項目同一目錄下,然後利用Python標準庫提供的CSV模塊可以用於分析CSV文件中的數據行(也就是上面提到的記錄),讓我們能快速提取感興趣的值。案例代碼如下:

import csv

# 包含一個sitka城市七月份天氣信息的CSV文件,裏面都是用逗號隔開
filename = 'sitka_weather_07-2014.csv'

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

運行結果如下:
談談Python實戰數據可視化之matplotlib模塊(實戰篇)
好了,初步獲取到了CSV文件的內容,但是我們有一點要注意,就是reader裏面的每行記錄只能被遍歷一次,我們下面添加一行代碼更深刻領會:

import csv

filename = 'sitka_weather_07-2014.csv'

with open(filename) as f:
    reader = csv.reader(f)
    print(reader)
    print(list(reader))  # 值得注意的是,當先調用 print(list(reader)),發現遍歷到最後了,再執行後面的代碼就報錯了
    head_row = next(reader)
    print(head_row)
    for row in reader:
        print(reader.line_num, row)

運行結果如下:
談談Python實戰數據可視化之matplotlib模塊(實戰篇)
對上面的結果進行分析:對於list內置函數,內部實現大概可以猜到是先將reader對象裏面的記錄遍歷再添加進一個列表中,然後返回整個列表。調用list內置函數其實已經遍歷一次了,遍歷指針指向了最後一個記錄,並且因爲reader的記錄(一行算一個記錄)只能被遍歷一次的特性,所以後面的代碼再遍歷reader對象就沒啥意義了。

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

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

# 繪製錫特卡7月份的天氣數據
# 導入python支持的csv模塊,用來處理csv文件,分析csv文件中的數據行,讓我們提取我們感興趣的值
import csv
# 導入matplotlib包裏的pyplot模塊,用於可視化獲取到的每天最高溫度
from matplotlib import pyplot as plt

from datetime import datetime

# 包含一個城市天氣信息的CSV文件,裏面都是用逗號隔開
filename = 'sitka_weather_07-2014.csv'

# 打開csv文件,實例化一個csv模塊的reader閱讀器對象
with open(filename) as f:
    reader = csv.reader(f)
    head_row = next(reader)  # 返回第一行的記錄內容組成的字符串列表,例如:['1','2'....]
    highs = []  # 用於存儲每天最高的溫度
    dates = []  # 用於存儲日期
    for row in reader:  # row也是返回遍歷行的記錄內容組成的字符串列表
        current_date = datetime.strptime(row[0], "%Y-%m-%d")  # 講時間字符串轉化爲指定格式的datetime對象
        dates.append(current_date)
        high = int(row[1])  # 由於前面已經next過一次了,根據reader只能被遍歷一次的性質,這裏for循環就從第二行開始遍歷
        highs.append(high)  # 將每天的最高溫度保存在highs列表中,這時候列表存儲的元素都是數字而非字符串,那麼我們就可以利用這個列表進行可視化處理了
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()  # 繪製傾斜的日期標籤
plt.ylabel("Temperature (F)", fontsize=16)
plt.tick_params(axis='both', which='major', labelsize=14)
plt.show()

運行結果如下:
談談Python實戰數據可視化之matplotlib模塊(實戰篇)
仔細觀察上面的運行結果,X軸還是與書本圖片有些出入,其實無礙,這是正確的,因爲我們運行的結果也是7月初開始,只不過X軸把6月份也包括進去了。

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

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

# 繪製錫特卡整年的天氣數據,未進行錯誤檢查
# 導入python支持的csv模塊,用來處理csv文件,分析csv文件中的數據行,讓我們提取我們感興趣的值
import csv
# 導入matplotlib包裏的pyplot模塊,用於可視化獲取到的每天最高溫度
from matplotlib import pyplot as plt

from datetime import datetime

# 包含一個城市天氣信息的CSV文件,裏面都是用逗號隔開
filename = 'sitka_weather_2014.csv'

# 打開csv文件,實例化一個csv模塊的reader閱讀器對象
with open(filename) as f:
    reader = csv.reader(f)
    head_row = next(reader)  # 返回第一行的記錄內容組成的字符串列表,例如:['1','2'....]
    highs = []  # 用於存儲整年每一天中的最高溫度
    dates = []  # 用於存儲日期
    lows = []  # 用於存儲整年每一天中的最低溫度
    for row in reader:  # row也是返回遍歷行的元素內容組成的字符串列表
        current_date = datetime.strptime(row[0], "%Y-%m-%d")
        dates.append(current_date)
        high = int(row[1])  # 由於前面已經next過一次了,根據reader只能被遍歷一次的性質,這裏for循環就從第二行開始遍歷
        highs.append(high)  # 將每天的最高溫度保存在highs列表中,這時候列表存儲的元素都是數字而非字符串,那麼我們就可以利用這個列表進行可視化處理了
        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)  # 填充每日最高氣溫和最低氣溫之間的區域
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()

運行結果如下:
談談Python實戰數據可視化之matplotlib模塊(實戰篇)
由於有些氣象站會偶爾出現故障,未能收集全應該收集的數據,所以如果我們還是採用上一個代碼例子這樣獲取某個城市的天氣數據,那麼就會報錯,因爲這個城市的csv文件中某一天可能是缺少數據的,所以會報ValueError錯誤。就如下圖這樣缺少某天的數據:
談談Python實戰數據可視化之matplotlib模塊(實戰篇)
所以,鑑於上面的問題,下一節獲取死亡谷整年的天氣數據將會採用異常處理機制就能預防這種情況。

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

前面說了可能在實際應用中可能會出現缺少數據等問題,作爲一名程序開發者,必須設想到各種可能出現的問題,並且採用實用的方法解決問題。我們將會採用異常處理機制來繪製死亡谷2014年每日最高氣溫和最低氣溫折線圖。代碼如下:

# 導入python支持的csv模塊,用來處理csv文件,分析csv文件中的數據行,讓我們提取我們感興趣的值
import csv
# 導入matplotlib包裏的pyplot模塊,用於可視化獲取到的每天最高溫度
from matplotlib import pyplot as plt

from datetime import datetime

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

# 打開csv文件,實例化一個csv模塊的reader閱讀器對象
with open(filename) as f:
    reader = csv.reader(f)
    head_row = next(reader)  # 返回第一行的記錄內容組成的字符串列表,例如:['1','2'....]
    highs = []  # 用於存儲每天最高的溫度
    dates = []  # 用於存儲日期
    lows = []  # 用於存儲每天最低的溫度
    for row in reader:  # row也是返回遍歷行的記錄內容組成的字符串列表
        try:
            current_date = datetime.strptime(row[0], "%Y-%m-%d")
            high = int(row[1])  # 由於前面已經next過一次了,根據reader只能被遍歷一次的性質,這裏for循環就從第二行開始遍歷
            low = int(row[3])
        except ValueError:
            print(current_date,'missing data')
        else:
            dates.append(current_date)
            highs.append(high)  # 將每天的最高溫度保存在highs列表中,這時候列表存儲的元素都是數字而非字符串,那麼我們就可以利用這個列表進行可視化處理了
            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()

運行結果如下(兩張圖):
(1)折線圖
談談Python實戰數據可視化之matplotlib模塊(實戰篇)
(2)終端圖
談談Python實戰數據可視化之matplotlib模塊(實戰篇)
通過上面兩個圖可以知道,2014-02-16這一天的溫度數據是丟失了,所以在折線圖其實沒有畫出2014-02-16這一天的最高和最低氣溫(由於太密集看不出)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章