Python繪制三維填充折線圖的示例代碼
在數(shù)據(jù)可視化領(lǐng)域,三維圖形能夠以更直觀的方式展示數(shù)據(jù)之間的復(fù)雜關(guān)系。今天,我們將從頭開始,一步步學(xué)習(xí)如何使用Python中的matplotlib庫繪制一個(gè)漂亮的三維填充折線圖。即使你之前沒有接觸過Python繪圖,也不用擔(dān)心,我們將詳細(xì)解釋每一步。
一、準(zhǔn)備工作:安裝必要的庫
在開始之前,我們需要確保安裝了numpy和matplotlib這兩個(gè)Python庫。如果你還沒有安裝它們,可以通過以下命令安裝:
pip install numpy matplotlib
這兩個(gè)庫是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(通常簡寫為np)用于生成和處理數(shù)據(jù)。matplotlib.pyplot(簡寫為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)中沒有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ù),用來展示圖表的效果。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是通過高斯函數(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)度組合起來。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é)
通過以上步驟,我們用Python和matplotlib庫成功繪制了一個(gè)三維填充折線圖。雖然代碼看起來有點(diǎn)長,但其實(shí)每一步都很簡單。你可以根據(jù)自己的需求修改數(shù)據(jù)、顏色和樣式,制作出屬于自己的圖表。
到此這篇關(guān)于Python繪制三維填充折線圖的示例代碼的文章就介紹到這了,更多相關(guān)Python繪制折線圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python創(chuàng)建二維數(shù)組實(shí)例(關(guān)于list的一個(gè)小坑)
下面小編就為大家?guī)硪黄狿ython創(chuàng)建二維數(shù)組實(shí)例(關(guān)于list的一個(gè)小坑)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11
Django上使用數(shù)據(jù)可視化利器Bokeh解析
這篇文章主要介紹了Django上使用數(shù)據(jù)可視化利器Bokeh解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07
檢測(cè)pytorch是否使用GPU的方法小結(jié)
pytorch在服務(wù)器上跑的很慢,nvidia-smi顯示GPU利用率一直是0%,所以本文總結(jié)了一些可以檢測(cè)深度學(xué)習(xí)算法是否在使用GPU的方法,需要的朋友可以參考下2023-12-12
正則表達(dá)式在Python中的應(yīng)用小結(jié)
正則表達(dá)式是一種強(qiáng)大的文本模式匹配工具,它可以幫助我們快速地檢索、替換或提取字符串中的特定模式,在本文中,我將通過一些示例代碼,詳細(xì)介紹正則表達(dá)式在Python中的應(yīng)用,感興趣的朋友一起看看吧2024-07-07
Python pickle模塊進(jìn)行序列化的實(shí)現(xiàn)示例
pickle模塊是一個(gè)用于實(shí)現(xiàn)數(shù)據(jù)序列化與反序列化的強(qiáng)大工具,本文就來介紹一下Python pickle模塊進(jìn)行序列化的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2025-01-01
python MultipartEncoder傳輸zip文件實(shí)例
這篇文章主要介紹了python MultipartEncoder傳輸zip文件實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04

