Matplotlib:數據可視化的藝術與科學

引言:讓數據開口說話

在數據分析與機器學習領域,可視化是理解數據的重要橋梁。Matplotlib 作為 Python 最流行的繪圖庫,提供了從簡單折線圖到復雜 3D 圖表的完整解決方案。本文將通過實際案例,帶您從基礎繪圖到高級定制全面掌握 Matplotlib 的核心能力。

Pyplot 是 Matplotlib 的子庫,提供了和 MATLAB 類似的繪圖 API。Pyplot 是常用的繪圖模塊,能很方便讓用戶繪制 2D 圖表。

Pyplot 包含一系列繪圖函數的相關函數,每個函數會對當前的圖像進行一些修改,例如:給圖像加上標記,生新的圖像,在圖像中產生新的繪圖區域等等。使用的時候,我們可以使用 import 導入 pyplot 庫,并設置一個別名?plt:

import matplotlib.pyplot as plt

這樣我們就可以使用?plt?來引用 pyplot 包的方法。

以下是一些常用的 pyplot 函數:

  • plot():用于繪制線圖和散點圖
  • scatter():用于繪制散點圖
  • bar():用于繪制垂直條形圖和水平條形圖
  • hist():用于繪制直方圖
  • pie():用于繪制餅圖
  • imshow():用于繪制圖像
  • subplots():用于創建子圖

常見統計圖繪制與代碼實踐

曲線圖?

曲線圖的繪制

我們將首先繪制一條簡單的曲線,同時還將簡單介紹matplotlib的工作原理。

import matplotlib.pyplot as plt
x = range(50)
y = [value * 2 for value in x]
plt.plot(x, y)
plt.show()

上述代碼將會繪制曲線y=2*x,其中x在[0,50]范圍內,如下所示:

可以看到窗口上方還包含多個圖標,其中:?

項目value
此按鈕用于將所繪制的圖形另存為所需格式的圖片,包括png,jpg,pdf,svg等常見格式
此按鈕用于調整圖片的尺寸,邊距等圖片屬性
此按鈕用于縮放圖片,用于觀察圖形細節,單擊此按鈕后,在圖形上使用鼠標左鍵拖拽進行放大,使用鼠標右鍵拖拽進行縮小
此按鈕用于移動圖形,可以與“縮放”按鈕結合觀察放大后圖片的具體細節,同時,單擊此按鈕后,在圖形上使用鼠標右鍵拖拽可以縮放坐標軸的比例
此按鈕用于將圖形恢復到其初始狀態,取消縮放、移動等操作
結合Numpy庫,繪制曲線圖

繪制曲線cos(x),x在[0, 2*pi]區間內:

import math
import matplotlib.pyplot as plt
scale = range(100)
x = [(2 * math.pi * i) / len(scale) for i in scale]
y = [math.cos(i) for i in x]
plt.plot(x, y)
plt.show()

若采用Numpy庫,則可以使用以下等效代碼:

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2 * np.pi, 100)
y = np.cos(x)
plt.plot(x, y)
plt.show()

所繪制圖形如下所示:

Tips:雖然Numpy對于可視化而言并非必要,但可以看出使用Numpy庫可以更加高效。

Numpy可以一次對整個數組執行操作,可以使代碼更高效,以繪制[-10,10]區間內的曲線y=x^{3}+5x-10為例:

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-10, 10, 800)
y = x ** 3 + 5 * x - 10
plt.plot(x, y)
plt.show()

繪制圖形如下

繪制多曲線圖

很多時候我們需要對比多組數據,以發現數據間的異同,此時就需要在一張圖片上繪制多條曲線——多曲線圖,下圖展示了在同一圖片中繪制函數y=xy=x^{^{2}}y=log_{e}x以及y=sin(x)

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0.1, 2 * np.pi, 100)
y_1 = x
y_2 = np.square(x)
y_3 = np.log(x)
y_4 = np.sin(x)
plt.plot(x,y_1)
plt.plot(x,y_2)
plt.plot(x,y_3)
plt.plot(x,y_4)
plt.show()

上述腳本繪制圖形如下:

Tips:一條曲線的繪制需要調用一次plt.plot(),而plt.show()只需調用一次。這種延遲呈現機制是matplotlib的核心,我們可以聲明在任何時間繪制圖形,但只有在調用plt.show()時才會渲染顯示圖形。

讀取數據文件繪制曲線圖

很多情況下數據都是存儲于文件中,因此,需要首先讀取文件中的數據,再進行繪制,說明起見,以.txt文件為例,其他諸如Excel、CSV文件可以使用pandas、numpy等庫進行讀取。
假設存在data.txt文件如下:

0 1
1 2
2 5
4 17
5 26
6 37

讀取數據和繪制的代碼如下:

import matplotlib.pyplot as plt
x, y = [], []
for line in open('data.txt', 'r'):values = [float(s) for s in line.split()]x.append(values[0])y.append(values[1])
plt.plot(x, y)
plt.show()

如果使用Numpy庫,其等效代碼可以寫為:

import matplotlib.pyplot as plt
import numpy as np
data = np.loadtxt('data.txt')
plt.plot(data[:,0], data[:,1])
plt.show()

散點圖

當繪制曲線圖時,我們假設點與點之間存在序列關系。而散點圖是簡單地繪制點,它們之間并不存在連接。

import numpy as np
import matplotlib.pyplot as plt
data = np.random.rand(1000, 2)
plt.scatter(data[:,0], data[:,1])
plt.show()

?Tips:函數plt.scatter()的調用方式與plt.plot()完全相同,分別將點的x和y坐標作為輸入參數。

條形圖

條形圖具有豐富的表現形式,常見的類型包括單組條形圖,多組條形圖,堆積條形圖和對稱條形圖等。

單組條形圖

條形圖的每種表現形式都可以繪制成垂直條形圖或水平條形圖,以單組條形圖的兩種繪制方式為例。

垂直條形圖
import matplotlib.pyplot as plt
data = [10., 20., 5., 15.]
plt.bar(range(len(data)), data)
plt.show()

Tips:plt.plot()函數的作用是:接收兩個參數,包括每個條形的x坐標和每個條行的高度。

通過可選參數width,pyplot.bar()提供了一種控制條形圖中條狀寬度的方法:

import matplotlib.pyplot as plt
data = [10., 20., 5., 15.]
plt.bar(range(len(data)), data, width=0.5)
plt.show()

水平條形圖

如果更喜歡水平條形外觀,就可以使用plt.barh()函數,在用法方面與plt.bar()基本相同,但是修改條形寬度(或者在水平條形圖中應該稱為高度)的參數需要使用height

多組條形圖

當需要比較不同年份相應季度的銷量等此類需求時,我們可能需要多組條形圖。

import numpy as np
import matplotlib.pyplot as plt
data = [[10., 20., 30., 20.],[40., 25., 53., 18.],[6., 22., 52., 19.]]
x = np.arange(4)
plt.bar(x + 0.00, data[0], color = 'b', width = 0.25)
plt.bar(x + 0.25, data[1], color = 'g', width = 0.25)
plt.bar(x + 0.50, data[2], color = 'r', width = 0.25)
plt.show()

堆積條形圖

通過使用plt.bar()函數中的可選參數,可以繪制堆積條形圖。

import matplotlib.pyplot as plt
y_1 = [3., 25., 45., 22.]
y_2 = [6., 25., 50., 25.]
x = range(4)
plt.bar(x, y_1, color = 'b')
plt.bar(x, y_2, color = 'r', bottom = y_1)
plt.show()

Tips:plt.bar()函數的可選參數bottom允許指定條形圖的起始值。
可以結合for循環,利用延遲呈現機制堆疊更多的條形:

import numpy as np
import matplotlib.pyplot as plt
data = np.array([[5., 30., 45., 22.], [5., 25., 50., 20.], [1., 2., 1., 1.]])
x = np.arange(data.shape[1])
for i in range(data.shape[0]):plt.bar(x, data[i], bottom = np.sum(data[:i], axis = 0))
plt.show() 

對稱條形圖

一個簡單且有用的技巧是對稱繪制兩個條形圖。例如想要繪制不同年齡段的男性與女性數量的對比:

import numpy as np
import matplotlib.pyplot as plt
w_pop = np.array([5., 30., 45., 22.])
m_pop = np.array( [5., 25., 50., 20.])
x = np.arange(4)
plt.barh(x, w_pop)
plt.barh(x, -m_pop)
plt.show()

圖中女性人口的條形圖照常繪制。然而,男性人口的條形圖的條形圖的條形圖向左延伸,而不是向右延伸。可以使用數據的負值來快速實現對稱條形圖的繪制。

餅圖

餅圖可以用于對比數量間的相對關系:

import matplotlib.pyplot as plt
data = [10, 15, 30, 20]
plt.pie(data)
plt.show()

Tips:plt.pie()函數將一系列值作為輸入,將值傳遞給matplolib,它就會自動計算各個值在餅圖中的相對面積,并進行繪制。

直方圖

直方圖是概率分布的圖形表示。事實上,直方圖只是一種特殊的條形圖。我們可以很容易地使用matplotlib的條形圖函數,并進行一些統計運算來生成直方圖。但是,直方圖非常有用,因此matplotlib提供了一個更加方便的函數:

import numpy as np
import matplotlib.pyplot as plt
x = np.random.randn(1024)
plt.hist(x, bins = 200)
plt.show()

Tips:plt.hist()函數的作用是:獲取一系列值作為輸入。值的范圍將被劃分為大小相等的范圍(默認情況下數量為10),然后生成條形圖,一個范圍對應一個條柱,一個條柱的高度是相應范圍內中的值的數量,條柱的數量由可選參數bins確定。

三角網格圖

處理空間位置時會出現網格圖。除了顯示點之間的距離和鄰域關系外,三角網格圖也是表示地圖的一種方便方法。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.tri as tri
data = np.random.rand(200, 2)
triangles = tri.Triangulation(data[:,0], data[:,1])
plt.triplot(triangles)
plt.show()

Tips:代碼中導入了matplotlib.tri模塊,該模塊提供了從點計算三角網格的輔助函數。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/75644.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75644.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75644.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python數據可視化-第4章-圖表樣式的美化

環境 開發工具 VSCode庫的版本 numpy1.26.4 matplotlib3.10.1 ipympl0.9.7教材 本書為《Python數據可視化》一書的配套內容,本章為第4章 圖表樣式的美化 本章主要介紹了圖表樣式的美化,包括圖表樣式概述、使用顏色、選擇線型、添加數據標記、設置字體…

嵌入式海思Hi3861連接華為物聯網平臺操作方法

1.1 實驗目的 快速演示 1、認識輕量級HarmonyOS——LiteOS-M 2、初步掌握華為云物聯網平臺的使用 3、快速驅動海思Hi3861 WIFI芯片,連接互聯網并登錄物聯網平臺

如何在Redis容量限制下保持熱點數據

如何在Redis容量限制下保持熱點數據 當數據庫有100萬條數據但Redis只能保存10萬條時,需要智能的策略來確保Redis中存儲的都是最常訪問的熱點數據。以下是幾種有效的解決方案: 一、內存淘汰策略 Redis提供了多種內存淘汰機制,當內存不足時會自動刪除部分數據: 策略命令/配…

cv2.fillPoly()和cv2.polylines()

參數解釋 cv2.fillPoly() 和 cv2.polylines() 都是 OpenCV 的函數。功能是繪制多邊形,cv2.fillPoly()可繪制實心多邊形, cv2.polylines() 可繪制空心多邊形 cv2.fillPoly()用途:提取ROI 可在黑色圖像上,填充白色,作為…

數據庫--SQL

SQL:Structured Query Language,結構化查詢語言 SQL是用于管理關系型數據庫并對其中的數據進行一系列操作(包括數據插入、查詢、修改刪除)的一種語言 分類:數據定義語言DDL、數據操縱語言DML、數據控制語言DCL、事務處…

【python】速通筆記

Python學習路徑 - 從零基礎到入門 環境搭建 安裝Python Windows: 從官網下載安裝包 https://www.python.org/downloads/Mac/Linux: 通常已預裝,可通過終端輸入python3 --version檢查 配置開發環境 推薦使用VS Code或PyCharm作為代碼編輯器安裝Python擴展插件創建第…

批量刪除git本地分支和遠程分支命令

1、按照關鍵詞開頭匹配刪除遠程分支 git branch -r | grep "origin/feature/develop-1"| sed s/origin\///g | xargs -n 1 git push origin --delete git branch -r 列出所有遠端分支。 grep "origin/feature/develop-1" 模糊匹配分支名稱包含"orig…

上市電子制造企業如何實現合規的質量文件管理?

浙江潔美電子科技股份有限公司成立于2001年,是一家專業為片式電子元器件(被動元件、分立器件、集成電路及LED)配套生產電子薄型載帶、上下膠帶、離型膜、流延膜等產品的國家高新技術企業,主要產品有分切紙帶、打孔經帶、壓孔紙帶、上下膠帶、塑料載帶及其…

leetcode數組-有序數組的平方

題目 題目鏈接:https://leetcode.cn/problems/squares-of-a-sorted-array/ 給你一個按 非遞減順序 排序的整數數組 nums,返回 每個數字的平方 組成的新數組,要求也按 非遞減順序 排序。 輸入:nums [-4,-1,0,3,10] 輸出&#xff…

基于微信小程序的醫院掛號預約系統設計與實現

摘 要 現代經濟快節奏發展以及不斷完善升級的信息化技術,讓傳統數據信息的管理升級為軟件存儲,歸納,集中處理數據信息的管理方式。本微信小程序醫院掛號預約系統就是在這樣的大環境下誕生,其可以幫助管理者在短時間內處理完畢龐大…

密碼學基礎——DES算法

前面的密碼學基礎——密碼學文章中介紹了密碼學相關的概念,其中簡要地對稱密碼體制(也叫單鑰密碼體制、秘密密鑰體制)進行了解釋,我們可以知道單鑰體制的加密密鑰和解密密鑰相同,單鑰密碼分為流密碼和分組密碼。 流密碼&#xff0…

Redis分布式鎖詳解

Redis分布式鎖詳解 分布式鎖是在分布式系統中實現互斥訪問共享資源的重要機制。Redis因其高性能和原子性操作特性,常被用來實現分布式鎖。 一、基礎實現方案 1. SETNX EXPIRE方案(基本版) # 加鎖 SETNX lock_key unique_value # 設置唯…

創建Linux虛擬環境并遠程連接,finalshell自定義壁紙

安裝VMware 這里不多贅述。 掛載Linux系統 1). 打開Vmware虛擬機,打開 編輯 -> 虛擬網絡編輯器(N) 選擇 NAT模式,然后選擇右下角的 更改設置。 設置子網IP為 192.168.100.0,然后選擇 應用 -> 確定。 解壓 CentOS7-1.zip 到一個比較大…

podman和與docker的比較 及podman使用

Podman 與 Docker 的比較和區別 架構差異 Docker:采用客戶端 - 服務器(C/S)架構,有一個以 root 權限運行的守護進程 dockerd 來管理容器的生命周期。客戶端(docker 命令行工具)與守護進程進行通信&#x…

【Easylive】HttpServletRequest、HttpServletResponse、HttpSession 介紹

【Easylive】項目常見問題解答(自用&持續更新中…) 匯總版 這三個是 Java Web 開發(Servlet/JSP)的核心接口,用于處理 HTTP 請求和響應 以及 用戶會話管理。它們在 Spring MVC(Controller)中…

Markdown使用說明

以下是Markdown基礎使用教程及分割線展示方法: 📝 Markdown基礎使用教程 1. 標題 # 一級標題 ## 二級標題 ### 三級標題2. 文本樣式 *斜體* 或 _斜體_ **加粗** 或 __加粗__ ***加粗斜體*** 或 ___加粗斜體___ ~~刪除線~~3. 列表 - 無序列表項 * 另一…

Jmeter的壓測使用

Jmeter基礎功能回顧 一、創建Jmeter腳本 1、錄制新建 (1)適用群體:初學者 2、手動創建 (1)需要了解Jmeter的常用組件 元件:多個類似功能組件的容器(類似于類) 各元件作用 組件…

【rabbitmq基礎】

RabbitMq基礎 1.概念2.數據隔離3.使用控制臺向mq傳遞消息1.創建兩個隊列-“測試隊列”,“測試隊列2”2.創建一個交換機-"測試交換機"3.測試發送消息3.1讓交換機和隊列進行綁定3.2發送消息3.3查看消息 4.創建虛擬主機5.java使用rabbitmq5.1 發送消息5.2 消…

加固計算機廠家 | 工業加固筆記本電腦廠家

北京魯成偉業科技發展有限公司(以下簡稱“魯成偉業”)成立于2005年,是集研發、生產、銷售與服務于一體的高新技術企業,專注于加固計算機、工業加固筆記本電腦及特種計算機的研發與制造。憑借20年的技術積累與行業深耕,…

鏈路聚合配置命令

技術信息 加入捆綁組,加大鏈路間帶寬等 配置命令 華三 靜態聚合 將接口加入聚合口后再進行配置 //創建靜態鏈路聚合口1,不啟用lacp[SWB]interface Bridge-Aggregation 1 [SWB-Bridge-Aggregation1]port link-type trunk [SWB-Bridge-Aggregation…