談談Python實戰資料視覺效果之matplotlib模組(實戰篇)

來源:互聯網
上載者:User

標籤:結果   下載   max   exce   label   image   except   瞭解   開發人員   

前沿

通過上一篇談談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,ValueAFG,NGDP_R,2002,183.26AFG,NGDP_R,2003,198.736AFG,NGDP_R,2004,200.069AFG,NGDP_R,2005,223.737AFG,NGDP_R,2006,235.731AFG,NGDP_R,2007,267.177AFG,NGDP_R,2008,277.498AFG,NGDP_R,2009,334.621AFG,NGDP_R,2010,362.857AFG,NGDP_R,2011,386.368AFG,NGDP_R,2012,440.336AFG,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‘....]

運行結果如下:

好了,初步擷取到了CSV檔案的內容,但是我們有一點要注意,就是reader裡面的每行記錄只能被遍曆一次,我們下面添加一行代碼更深刻領會:

import csvfilename = ‘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)

運行結果如下:

對上面的結果進行分析:對於list內建函數,內部實現大概可以猜到是先將reader對象裡面的記錄遍曆再添加進一個列表中,然後返回整個列表。調用list內建函數其實已經遍曆一次了,遍曆指標指向了最後一個記錄,並且因為reader的記錄(一行算一個記錄)只能被遍曆一次的特性,所以後面的代碼再遍曆reader對象就沒啥意義了。

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

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

# 繪製錫特卡7月份的天氣資料# 匯入python支援的csv模組,用來處理csv檔案,分析csv檔案中的資料行,讓我們提取我們感興趣的值import csv# 匯入matplotlib包裡的pyplot模組,用於可視化擷取到的每天最高溫度from matplotlib import pyplot as pltfrom 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()

運行結果如下:

仔細觀察上面的運行結果,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 pltfrom 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()

運行結果如下:

由於有些氣象站會偶爾出現故障,未能收集全應該收集的資料,所以如果我們還是採用上一個代碼例子這樣擷取某個城市的天氣資料,那麼就會報錯,因為這個城市的csv檔案中某一天可能是缺少資料的,所以會報ValueError錯誤。就如這樣缺少某天的資料:

所以,鑒於上面的問題,下一節擷取死亡穀整年的天氣資料將會採用異常處理機制就能預防這種情況。

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

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

# 匯入python支援的csv模組,用來處理csv檔案,分析csv檔案中的資料行,讓我們提取我們感興趣的值import csv# 匯入matplotlib包裡的pyplot模組,用於可視化擷取到的每天最高溫度from matplotlib import pyplot as pltfrom 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)折線圖

(2)終端圖

通過上面兩個圖可以知道,2014-02-16這一天的溫度資料是丟失了,所以在折線圖其實沒有畫出2014-02-16這一天的最高和最低氣溫(由於太密集看不出)。

談談Python實戰資料視覺效果之matplotlib模組(實戰篇)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.