初探Matplotlib

来源:http://www.cnblogs.com/sun-haiyu/archive/2017/06/22/7067602.html
-Advertisement-
Play Games

初探Matplotlib 例子來自此書: 《Python編程從入門到實戰》【美】Eric Matthes 使用pyplot繪圖,一般的導入方法 以下代碼均在Jupyter Notebook中運行 折線圖 先看一個簡單的例子 圖如下,可以看到x軸太密了,甚至都有小數。 如果想x軸只出現我們的樣本值,可 ...


初探Matplotlib

例子來自此書: 《Python編程從入門到實戰》【美】Eric Matthes

使用pyplot繪圖,一般的導入方法import matplotlib.pyplot as plt

以下代碼均在Jupyter Notebook中運行

折線圖

先看一個簡單的例子

import matplotlib.pyplot as plt

in_values = [1, 2 ,3, 4, 5]
squares = [1, 4, 9 ,16, 25]
# 第一個參數是X軸輸入,第二個參數是對應的Y軸輸出;linewidth繪製線條的粗細
plt.plot(in_values, squares, linewidth=4)
# 標題、X軸、Y軸
plt.title('Squares', fontsize=20)
plt.xlabel('Value', fontsize=12)
plt.ylabel('Square of the value', fontsize=12)
# plt.tick_params(axis='both', labelsize=15)
plt.show()

圖如下,可以看到x軸太密了,甚至都有小數。

如果想x軸只出現我們的樣本值,可以使用tick_params函數修改刻度標記的大小。把上面代碼中的倒數第二行取消註釋,得到下麵的圖像。

plt.tick_params(axis='both', labelsize=15),其中axis=both表示同時影響x、y軸的刻度,labelsize指定了刻度的字型大小,字型大小變大,同一長度下顯示的坐標點數越少,反之亦反。由於將labelsize設置得比預設大了,故x、y軸顯示的坐標點數變少。更符合這個例子。

散點圖

還是上面的平方例子。這次使用散點圖繪製。

in_values = [1, 2 ,3, 4, 5]
squares = [1, 4, 9 ,16, 25]
# s參數為點的大小
plt.scatter(in_values, squares, s=80)
plt.title('Squares', fontsize=20)
plt.xlabel('Value', fontsize=12)
plt.ylabel('Square of the value', fontsize=12)
plt.tick_params(axis='both', labelsize=15)
plt.show()

可以看到,只是將plt.plot換成了plt.scatter,其餘的代碼基本沒變。

若輸入和輸出的點比較多,可使用列表推導式。同時可以指定點的顏色及點的輪廓顏色。預設點的顏色為藍色,輪廓為黑色。

x_values = list(range(1, 100))
y_values = [x**2 for x in x_values]
# c參數指定點的顏色,輪廓的顏色不進行設置(none)
plt.scatter(x_values, y_values, c='red', edgecolors='none' ,s=5)
# x、y軸的坐標範圍,註意提供一個列表,前兩個是x軸的範圍,後兩個是y軸的範圍
plt.axis([0, 110, 0, 11000])
plt.show()

顏色的自定義還可以使用RGB的模式,傳遞一個元組給參數c。元組裡麵包含三個[0, 1]之間的數,分別代表(R, G, B),數字越靠近0顏色越淡,越靠近1顏色越深。比如c=(0, 0 , 0.6)表示的是一種淺藍色。

依然是平方的圖,人懶就不寫標題了。

顏色映射

顏色映射通常是一系列顏色的漸變。在可視化中,顏色映射可反應數據的規律,比如顏色淺的值比較小,顏色深的值比較大。

看一個很簡單的例子,以y軸坐標值的大小映射。

x_values = list(range(1, 100))
y_values = [x**2 for x in x_values]
# 顏色映射,按照y軸的值從淺到深,顏色採用藍色
plt.scatter(x_values, y_values, c=x_values, cmap=plt.cm.Blues, edgecolors='none' ,s=5)
plt.axis([0, 110, 0, 11000])
# 取代show方法,保存圖片到文件所在目錄,bbox_inches='tight'可裁去多餘的白邊
plt.savefig('squares_plot.png', bbox_inches='tight')

可以看到,y值小的點,顏色很淺,幾乎看不到了;隨著y值則增大,顏色越來越深。

隨機漫步模擬

先寫一個隨機漫步的類,目的是隨機選擇前進的方向

from random import choice


def get_step():
    """
    獲得移動的步長
    """
    # 分別代表正半軸和負半軸
    direction = choice([1, -1])
    # 隨機選擇一個距離
    distance = choice([0, 1, 2, 3, 4])
    step = direction * distance
    return step

class RandomWalk:
    """
    一個生成隨機漫步數據的類
    """
    # 預設漫步5000步
    def __init__(self, num_points=5000):
        self.num_points = num_points
        self.x_values = [0]
        self.y_values = [0]

    def fill_walk(self):
        """
        計算隨機漫步包含的所有點
        """
        while len(self.x_values) < self.num_points:
            x_step = get_step()
            y_step = get_step()
            # 沒有位移,跳過不取
            if x_step == 0 and y_step == 0:
                continue

            # 計算下一個點的x和y, 第一次為都0,以前的位置 + 剛纔的位移 = 現在的位置
            next_x = self.x_values[-1] + x_step
            next_y = self.y_values[-1] + y_step

            self.x_values.append(next_x)
            self.y_values.append(next_y)

開始繪製

import matplotlib.pyplot as plt


rw = RandomWalk()
rw.fill_walk()
# figure的調用在plot或者scatter之前
# plt.figure(dpi=300, figsize=(10, 6))
# 這個列表包含了各點的漫步順序,第一個元素將是漫步的起點,最後一個元素是漫步的終點
point_numbers = list(range(rw.num_points))
# 使用顏色映射繪製顏色深淺不同的點,淺色的是先漫步的,深色是後漫步的,因此可以反應漫步軌跡
plt.scatter(rw.x_values, rw.y_values, c=point_numbers, cmap=plt.cm.Blues, s=1)
# 突出起點
plt.scatter(0, 0, c='green', edgecolors='none', s=50)
# 突出終點
plt.scatter(rw.x_values[-1], rw.y_values[-1], c='red', s=50)
# 隱藏坐標軸
plt.axes().get_xaxis().set_visible(False)
plt.axes().get_yaxis().set_visible(False)
# 指定解析度和圖像大小,單位是英寸

plt.show()

生成的圖片,密密麻麻的點。遠遠看去還挺好看。綠色的是漫步起點,紅色的是漫步的終點。

但是圖片有點不清晰,把rw.fill_walk()的下麵一行註釋取消。通常在繪圖前調用。

plt.figure(dpi=300, figsize=(10, 6))dpi=300即是300像素/英寸,這個適當調高可獲得清晰的圖片。figsize=(10, 6)傳入的參數是元組,表示繪圖視窗的尺寸,也就是圖片的尺寸了,單位英寸。

高清大圖,爽不爽?

處理CSV數據

我們也許需要分析別人提供的數據。一般是json和csv兩種格式的文件。這裡有個天氣的數據sitka_weather_2014.csv,是2014年美國錫特卡的天氣數據。這裡用matplotlib來處理csv文件,json文件的處理放到pygal中。

下載該數據sitka_weather_2014.csv

csv文件的第一行通常是是表頭,真正的數據從第二行開始。我們先看下表頭包含哪些數據。

import csv

filename = 'F:/Jupyter Notebook/matplotlib_pygal_csv_json/sitka_weather_2014.csv'
with open(filename) as f:
    reader = csv.reader(f)
    # 只調用了一次next,得到第一行表頭
    header_row = next(reader)
    for index, column_header in enumerate(header_row):
        print(index, column_header)

列印如下

0 AKST
1 Max TemperatureF
2 Mean TemperatureF
3 Min TemperatureF
4 Max Dew PointF
5 MeanDew PointF
6 Min DewpointF
7 Max Humidity
8  Mean Humidity
9  Min Humidity
...

我們對最高溫度和最低溫度感興趣,只需要獲得第1列和第3列的數據就行。另外日期數據在第1列。

接下來不難了。從第二行開始,將最高氣溫放入highs列表,最低氣溫放入lows列表,日期放入dates列表我們想要在x軸顯示日期,引入datetime模塊。

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

filename = 'F:/Jupyter Notebook/matplotlib_pygal_csv_json/sitka_weather_2014.csv'
with open(filename) as f:
    reader = csv.reader(f)
    # 只調用了一次next,得到第一行表頭
    header_row = next(reader)
    # 第一列是最高氣溫,由於上面next讀取過一行了,這裡實際從第二行開始,也是數據開始的那行
    # reader只能讀取一次,所以如下寫法dates為空
#     highs = [int(row[1]) for row in reader]
#     dates= [row[0] for row in reader]
    dates, highs, lows = [], [], []
    for row in reader:
        # 捕獲異常,防止出現數據為空的情況
        try:
            date = datetime.strptime(row[0], '%Y-%m-%d')
            # 第1列最高氣溫,讀取到是字元串,轉為int
            high = int(row[1])
            # 第3列最低氣溫
            low = int(row[3])
        except ValueError:
            print(date, 'missing data')
        else:
            dates.append(date)
            highs.append(high)
            lows.append(low)

# figure在plot之前調用
fig = plt.figure(dpi=300, figsize=(10, 6))
# 最高氣溫的折線圖
plt.plot(dates, highs, c='red')
# 最低氣溫的折線圖
plt.plot(dates, lows, c='blue')
# 在兩個y值之間填充顏色,facecolor為填充的顏色,alpha參數可指定顏色透明度,0.1表示顏色很淺接近透明
plt.fill_between(dates, highs, lows, facecolor='blue', alpha=0.1)
plt.title('Daily high and low temperatures - 2014', fontsize=20)
plt.xlabel('', fontsize=16)
plt.ylabel('Temperature(F)', fontsize=16)
# x軸的日期調整為斜著顯示
fig.autofmt_xdate()
plt.tick_params(axis='both',labelsize=15)
plt.show()

看以看出,7月到9月都很熱,但是5月出現過非常高的氣溫!

上面的代碼有一行date = datetime.strptime(row[0], '%Y-%m-%d')。註意%Y-%m-%d要和row[0]字元串的格式一致。舉個例子

# 下麵這句報錯time data '2017/6/23' does not match format '%Y-%m-%d'
print(datetime.strptime('2017/6/22', '%Y-%m-%d')) 
print(datetime.strptime('2017-6-22', '%Y-%m-%d'))

%Y指的是四位的年份, %y是兩位年份,%m是數字表示的月份,%d數字表示的月份中的一天。


by @sunhaiyu

2017.6.22


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 隨著公司業務的不斷變化,幾年前的 A 項目和底層 DB_A 資料庫華麗轉身為核心業務服務和核心資料庫。 想從 DB_A 資料庫獲取數據的 web 服務越來越多,項目之間的關係逐漸演變為下麵這樣: 很容易看出來按上圖這樣的發展趨勢會存在很多問題(項目關係為個人抽象出來的簡化版,實際情況比這要複雜的多) ...
  • 關於AbstractQueuedSynchronizer JDK1.5之後引入了併發包java.util.concurrent,大大提高了Java程式的併發性能。關於java.util.concurrent包我總結如下: AbstractQueuedSynchronizer是併發類諸如Reentra ...
  • 編碼: 把看的懂,變成看不懂的 String str = "中國"; byte[] bytes = str.getBytes(); System.out.println(Arrays.toString(bytes));解碼: 把看不懂的內容,變成能看懂的 String s = new String( ...
  • ConnectionFactory是用於產生到JMS伺服器的鏈接的,Spring為我們提供了多個ConnectionFactory,有SingleConnectionFactory和CachingConnectionFactory。SingleConnectionFactory對於建立JMS伺服器鏈... ...
  • 此電腦->屬性->高級系統設置->高級->環境變數 變數名:JAVA_HOME 變數值:C:\Program Files\Java\jdk_版本號_變數名:CLASSPATH 變數值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;變數名:Pat ...
  • 興緻所致,最近對後臺有些感興趣,就google後臺開發語言。多數網頁內發現的是PHP JS GO 這三種語言,我個人喜歡新事物,所以就選擇了GO。 話不多說,本人直接上Go的官網,下載安裝,Hello Go 一氣呵成。 Go語言的環境算是搭建完成,讓我們一起開始新世界大門。 ...
  • 第十六節 MySQLdb "win64位安裝python mysqldb1.2.5" ubuntu下安裝MySQLdb sudo apt get install python MySQLdb 導入MySQLdb庫 import MySQLdb 創建資料庫連接 conn = MySQLdb.conne ...
  • 前言 作為程式員,不管是.net程式員還是java程式員其實從骨子裡都不太喜歡各種配置文件的,記得剛開始學java SSH時動不動就裝B,來看看我的配置多不多,又是從.net開始寫java的程式員提起各種spring配置文件更是頭大,那麼Spring Boot誕生了,Spring Boot的誕生只為 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...