Python繪制三維填充折線圖的示例代碼
在數(shù)據(jù)可視化領(lǐng)域,三維圖形能夠以更直觀的方式展示數(shù)據(jù)之間的復(fù)雜關(guān)系。今天,我們將從頭開(kāi)始,一步步學(xué)習(xí)如何使用Python中的matplotlib庫(kù)繪制一個(gè)漂亮的三維填充折線圖。即使你之前沒(méi)有接觸過(guò)Python繪圖,也不用擔(dān)心,我們將詳細(xì)解釋每一步。
一、準(zhǔn)備工作:安裝必要的庫(kù)
在開(kāi)始之前,我們需要確保安裝了numpy和matplotlib這兩個(gè)Python庫(kù)。如果你還沒(méi)有安裝它們,可以通過(guò)以下命令安裝:
pip install numpy matplotlib
這兩個(gè)庫(kù)是Python數(shù)據(jù)科學(xué)領(lǐng)域中非?;A(chǔ)且強(qiáng)大的工具,numpy用于高效處理數(shù)值數(shù)據(jù),而matplotlib則用于數(shù)據(jù)可視化。
二、代碼解析:一步步搭建三維填充折線圖
1. 導(dǎo)入必要的模塊
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d.art3d import PolyCollection import matplotlib.cm as cm import matplotlib
numpy(通常簡(jiǎn)寫(xiě)為np)用于生成和處理數(shù)據(jù)。matplotlib.pyplot(簡(jiǎn)寫(xiě)為plt)是matplotlib中用于繪圖的主要模塊。PolyCollection是用于創(chuàng)建三維填充區(qū)域的工具。matplotlib.cm提供了豐富的顏色映射,用于給圖形上色。matplotlib用于設(shè)置全局繪圖參數(shù),比如字體和符號(hào)顯示。
2. 設(shè)置中文和負(fù)號(hào)顯示
matplotlib.rcParams['font.sans-serif'] = ['SimHei'] matplotlib.rcParams['axes.unicode_minus'] = False
這兩行代碼是為了確保在圖表中可以正常顯示中文字符和負(fù)號(hào)。如果你的系統(tǒng)中沒(méi)有SimHei字體,可以替換為其他支持中文的字體。
3. 模擬數(shù)據(jù)
num_samples = 5
mz = np.linspace(0, 100, 300)
spectra = []
np.random.seed(0)
for i in range(num_samples):
peak_positions = np.random.uniform(20, 80, 3)
peak_heights = np.random.uniform(0.8, 1.5, 3)
spectrum = sum(h * np.exp(-0.5 * ((mz - p)/3)**2) for p, h in zip(peak_positions, peak_heights))
spectrum += np.random.normal(0, 0.05, len(mz))
spectra.append(spectrum)這里我們生成了一些模擬數(shù)據(jù),用來(lái)展示圖表的效果。num_samples表示我們有5個(gè)樣本,mz是一個(gè)從0到100的線性分布的數(shù)組,表示質(zhì)荷比(M/Z)。spectra是一個(gè)列表,存儲(chǔ)每個(gè)樣本的光譜數(shù)據(jù)。
np.random.seed(0)是為了確保每次生成的數(shù)據(jù)都是一樣的,方便我們復(fù)現(xiàn)結(jié)果。peak_positions和peak_heights分別表示峰的位置和高度,它們是隨機(jī)生成的。spectrum是通過(guò)高斯函數(shù)生成的光譜數(shù)據(jù),最后加上了一些隨機(jī)噪聲。
4. 創(chuàng)建圖形
fig = plt.figure(figsize=(12, 7), facecolor='white') ax = fig.add_subplot(111, projection='3d')
plt.figure創(chuàng)建了一個(gè)新的圖形窗口,figsize參數(shù)設(shè)置了圖形的大小,facecolor設(shè)置了背景顏色。add_subplot添加了一個(gè)子圖,projection='3d'表示這是一個(gè)三維圖形。
5. 設(shè)置顏色和樣本標(biāo)簽
colors = cm.viridis(np.linspace(0.2, 0.8, num_samples)) sample_labels = ['樣本A', '樣本B', '樣本C', '樣本D', '樣本E']
cm.viridis是一個(gè)顏色映射,它會(huì)根據(jù)輸入的值生成一系列顏色。這里我們生成了5種顏色,用于區(qū)分不同的樣本。sample_labels是一個(gè)列表,存儲(chǔ)每個(gè)樣本的標(biāo)簽。
6. 構(gòu)建多邊形區(qū)域
verts = []
for spectrum in spectra:
verts.append(list(zip(mz, spectrum)))
poly = PolyCollection(
verts,
facecolors=colors,
edgecolors='k', # 添加黑色邊框
linewidths=0.6, # 細(xì)邊框
alpha=0.85 # 稍微增強(qiáng)填充透明度
)
ax.add_collection3d(poly, zs=range(num_samples), zdir='y')verts是一個(gè)列表,存儲(chǔ)每個(gè)樣本的多邊形頂點(diǎn)。zip(mz, spectrum)將質(zhì)荷比和對(duì)應(yīng)的光譜強(qiáng)度組合起來(lái)。PolyCollection用于創(chuàng)建填充的多邊形區(qū)域,facecolors設(shè)置了填充顏色,edgecolors和linewidths設(shè)置了邊框顏色和寬度,alpha設(shè)置了透明度。add_collection3d將多邊形區(qū)域添加到三維圖形中,zs和zdir參數(shù)用于指定每個(gè)樣本在三維空間中的位置。
7. 設(shè)置坐標(biāo)軸和標(biāo)題
ax.set_xlabel('質(zhì)荷比 (M/Z)', labelpad=12, fontsize=12, fontweight='bold')
ax.set_xlim(0, 100)
ax.set_ylabel('樣本', labelpad=12, fontsize=12, fontweight='bold')
ax.set_ylim(-0.5, num_samples - 0.5)
ax.set_yticks(range(num_samples))
ax.set_yticklabels(sample_labels, fontsize=11)
ax.set_zlabel('離子強(qiáng)度', labelpad=10, fontsize=12, fontweight='bold')
ax.set_zlim(0, 1.6)
ax.set_title('提取的質(zhì)譜子集', fontsize=14, fontweight='bold', pad=20)這里我們?cè)O(shè)置了坐標(biāo)軸的標(biāo)簽、范圍、刻度標(biāo)簽和標(biāo)題。labelpad參數(shù)用于調(diào)整標(biāo)簽的位置,fontsize和fontweight分別設(shè)置字體大小和粗細(xì)。
8. 美化網(wǎng)格線和調(diào)整邊距
ax.tick_params(axis='both', which='major', labelsize=10) ax.grid(True, linestyle='--', linewidth=0.5, alpha=0.4) fig.subplots_adjust(left=0.08, right=0.95, top=0.92, bottom=0.08)
tick_params設(shè)置了坐標(biāo)軸刻度的字體大小。grid添加了網(wǎng)格線,linestyle、linewidth和alpha分別設(shè)置了網(wǎng)格線的樣式、寬度和透明度。subplots_adjust調(diào)整了圖形的邊距,確保內(nèi)容不會(huì)被遮擋。
9. 顯示圖形
plt.show()
最后,調(diào)用plt.show()就可以顯示我們繪制的三維填充折線圖了。
三、運(yùn)行代碼并查看結(jié)果
當(dāng)你運(yùn)行上述代碼時(shí),你會(huì)看到一個(gè)三維填充折線圖。每個(gè)折線代表一個(gè)樣本的光譜數(shù)據(jù),填充區(qū)域的顏色表示不同的樣本,如下圖所示。

完整代碼如下:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.art3d import PolyCollection
import matplotlib.cm as cm
import matplotlib
# 設(shè)置中文和負(fù)號(hào)顯示
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False
# 模擬數(shù)據(jù)
num_samples = 5
mz = np.linspace(0, 100, 300)
spectra = []
np.random.seed(0)
for i in range(num_samples):
peak_positions = np.random.uniform(20, 80, 3)
peak_heights = np.random.uniform(0.8, 1.5, 3)
spectrum = sum(h * np.exp(-0.5 * ((mz - p)/3)**2) for p, h in zip(peak_positions, peak_heights))
spectrum += np.random.normal(0, 0.05, len(mz))
spectra.append(spectrum)
# 創(chuàng)建圖形
fig = plt.figure(figsize=(12, 7), facecolor='white')
ax = fig.add_subplot(111, projection='3d')
# 使用viridis色圖
colors = cm.viridis(np.linspace(0.2, 0.8, num_samples))
sample_labels = ['樣本A', '樣本B', '樣本C', '樣本D', '樣本E']
# 構(gòu)建多邊形區(qū)域
verts = []
for spectrum in spectra:
verts.append(list(zip(mz, spectrum)))
poly = PolyCollection(
verts,
facecolors=colors,
edgecolors='k',
linewidths=0.6,
alpha=0.85
)
ax.add_collection3d(poly, zs=range(num_samples), zdir='y')
# 設(shè)置坐標(biāo)軸
ax.set_xlabel('質(zhì)荷比 (M/Z)', labelpad=12, fontsize=12, fontweight='bold')
ax.set_xlim(0, 100)
ax.set_ylabel('樣本', labelpad=12, fontsize=12, fontweight='bold')
ax.set_ylim(-0.5, num_samples - 0.5)
ax.set_yticks(range(num_samples))
ax.set_yticklabels(sample_labels, fontsize=11)
ax.set_zlabel('離子強(qiáng)度', labelpad=10, fontsize=12, fontweight='bold')
ax.set_zlim(0, 1.6)
# 標(biāo)題
ax.set_title('提取的質(zhì)譜子集', fontsize=14, fontweight='bold', pad=20)
# 網(wǎng)格線美化
ax.tick_params(axis='both', which='major', labelsize=10)
ax.grid(True, linestyle='--', linewidth=0.5, alpha=0.4)
# 調(diào)整邊距
fig.subplots_adjust(left=0.08, right=0.95, top=0.92, bottom=0.08)
# 顯示圖
plt.show()四、總結(jié)
通過(guò)以上步驟,我們用Python和matplotlib庫(kù)成功繪制了一個(gè)三維填充折線圖。雖然代碼看起來(lái)有點(diǎn)長(zhǎng),但其實(shí)每一步都很簡(jiǎn)單。你可以根據(jù)自己的需求修改數(shù)據(jù)、顏色和樣式,制作出屬于自己的圖表。
到此這篇關(guān)于Python繪制三維填充折線圖的示例代碼的文章就介紹到這了,更多相關(guān)Python繪制折線圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python動(dòng)態(tài)規(guī)劃實(shí)現(xiàn)虛擬機(jī)部署的算法思想
這篇文章主要介紹了Python動(dòng)態(tài)規(guī)劃實(shí)現(xiàn)虛擬機(jī)部署的算法思想,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07
Python3.5面向?qū)ο蟪绦蛟O(shè)計(jì)之類(lèi)的繼承和多態(tài)詳解
這篇文章主要介紹了Python3.5面向?qū)ο蟪绦蛟O(shè)計(jì)之類(lèi)的繼承和多態(tài),結(jié)合實(shí)例形式詳細(xì)分析了Python3.5面向?qū)ο蟪绦蛟O(shè)計(jì)中類(lèi)的繼承與多態(tài)常見(jiàn)用法及相關(guān)注意事項(xiàng),需要的朋友可以參考下2019-04-04
Pandas多級(jí)索引的實(shí)現(xiàn)示例
Pandas 中的多級(jí)索引是一種強(qiáng)大的工具,用于處理具有多個(gè)維度或?qū)哟蔚臄?shù)據(jù),本文主要介紹了Pandas多級(jí)索引的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01
使用Python和Plotly繪制各種類(lèi)型3D圖形的方法
Python語(yǔ)言擁有豐富的數(shù)據(jù)可視化庫(kù),其中Plotly是一款流行的工具,提供了繪制高質(zhì)量三維圖形的功能,本文將介紹如何使用Python和Plotly來(lái)繪制各種類(lèi)型的3D圖形,并給出代碼實(shí)例,需要的朋友可以參考下2024-05-05
Python如何實(shí)現(xiàn)網(wǎng)絡(luò)自動(dòng)化運(yùn)維華為設(shè)備
本文介紹了如何使用Python實(shí)現(xiàn)華為設(shè)備的網(wǎng)絡(luò)自動(dòng)化運(yùn)維,包括環(huán)境配置、設(shè)備配置、功能模塊實(shí)現(xiàn)和SFTP文件傳輸測(cè)試2024-11-11
Python基于smtplib實(shí)現(xiàn)異步發(fā)送郵件服務(wù)
這篇文章主要介紹了Python基于smtplib實(shí)現(xiàn)異步發(fā)送郵件服務(wù),需要的朋友可以參考下2015-05-05

