使用Python打造帶類別標(biāo)簽的三維柱狀圖
一、帶類別標(biāo)簽的三維柱狀圖介紹
帶類別標(biāo)簽的三維柱狀圖是一種在三維空間中展示分類數(shù)據(jù)的可視化工具。它不僅能夠通過(guò)柱子的高度直觀地表示數(shù)據(jù)的大小,還能通過(guò)顏色或圖例區(qū)分不同的類別。這種圖表特別適合展示多組數(shù)據(jù)之間的對(duì)比關(guān)系,例如不同類別在某個(gè)變量上的表現(xiàn),或者多個(gè)類別在不同條件下的差異。
特點(diǎn)
- 三維空間展示:通過(guò) x、y、z 三個(gè)坐標(biāo)軸,展示數(shù)據(jù)的多維度信息。
- 分類標(biāo)注:通過(guò)顏色或圖例區(qū)分不同的類別,使圖表更具表現(xiàn)力。
- 直觀對(duì)比:柱子的高度直觀地反映了數(shù)據(jù)的大小,方便進(jìn)行對(duì)比分析。
應(yīng)用場(chǎng)景
- 數(shù)據(jù)分析:展示不同類別在某個(gè)指標(biāo)上的表現(xiàn),例如不同產(chǎn)品的銷售額。
- 科學(xué)研究:比較不同實(shí)驗(yàn)組在某個(gè)變量上的差異,例如不同藥物的療效。
- 商業(yè)報(bào)告:呈現(xiàn)市場(chǎng)調(diào)研結(jié)果,例如不同地區(qū)的消費(fèi)偏好。
二、數(shù)據(jù)類型準(zhǔn)備
在繪制帶類別標(biāo)簽的三維柱狀圖之前,我們需要準(zhǔn)備以下幾類數(shù)據(jù):
- 坐標(biāo)數(shù)據(jù):用于確定柱子在三維空間中的位置。通常包括 x、y 坐標(biāo),它們可以是連續(xù)的數(shù)值,也可以是離散的類別。
- 高度數(shù)據(jù):表示柱子的高度,反映了數(shù)據(jù)的大小。它是一個(gè)二維數(shù)組,每個(gè)元素對(duì)應(yīng)一個(gè)柱子的高度。
- 類別標(biāo)簽(可選):如果需要對(duì)柱子進(jìn)行分類標(biāo)注,還需要準(zhǔn)備類別標(biāo)簽。這些標(biāo)簽可以是數(shù)字、字符串等,用于區(qū)分不同類別的柱子。
在代碼中,數(shù)據(jù)要準(zhǔn)備好:
x和y是坐標(biāo)數(shù)據(jù),通過(guò)np.arange和np.meshgrid生成了一個(gè) 10×10 的網(wǎng)格。z_height是高度數(shù)據(jù),是一個(gè) 10×10 的二維數(shù)組,每個(gè)元素表示對(duì)應(yīng)位置柱子的高度。- 類別標(biāo)簽沒(méi)有明確給出,但從
z_height的值可以推斷出不同的高度對(duì)應(yīng)不同的類別。
三、代碼解釋
以下是代碼的詳細(xì)解釋,幫助你理解每一步的作用。
導(dǎo)入必要的庫(kù)
import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d import Axes3D from matplotlib import rcParams
matplotlib.pyplot是用于繪圖的庫(kù)。numpy是用于數(shù)值計(jì)算的庫(kù),方便生成和操作數(shù)據(jù)。mpl_toolkits.mplot3d提供了三維繪圖的功能。rcParams用于設(shè)置全局的繪圖參數(shù),比如字體和負(fù)號(hào)顯示。
設(shè)置支持中文的字體
rcParams['font.family'] = 'SimHei' rcParams['axes.unicode_minus'] = False
這兩行代碼的作用是讓圖表支持中文顯示,并且正確顯示負(fù)號(hào)。如果不設(shè)置,可能會(huì)出現(xiàn)中文亂碼或負(fù)號(hào)顯示不正常的情況。
數(shù)據(jù)準(zhǔn)備
x = np.arange(1, 11)
y = np.arange(1, 11)
x, y = np.meshgrid(x, y)
z = np.zeros_like(x)
z_height = np.array([[5, 3, 8, 6, 7, 2, 9, 4, 5, 6],
[4, 5, 7, 8, 6, 3, 5, 2, 4, 3],
[7, 8, 6, 5, 4, 9, 3, 7, 8, 6],
[2, 4, 3, 7, 8, 5, 6, 9, 4, 5],
[6, 7, 8, 5, 4, 3, 2, 6, 7, 8],
[3, 2, 5, 4, 6, 7, 8, 5, 3, 2],
[8, 6, 7, 3, 2, 4, 5, 7, 8, 6],
[5, 4, 2, 6, 7, 8, 3, 5, 4, 2],
[9, 3, 7, 8, 6, 5, 4, 9, 3, 7],
[4, 5, 6, 7, 8, 9, 2, 4, 5, 6]])x和y是通過(guò)np.arange生成的從 1 到 10 的數(shù)組,表示 x 和 y 坐標(biāo)。np.meshgrid將x和y轉(zhuǎn)換為網(wǎng)格形式,生成一個(gè)二維數(shù)組,方便后續(xù)繪制柱子的位置。z是一個(gè)全為零的二維數(shù)組,表示柱子的底部在 z 軸上的位置。z_height是一個(gè)二維數(shù)組,表示每個(gè)柱子的高度。
圖形設(shè)置
fig = plt.figure(figsize=(10, 8), dpi=100) ax = fig.add_subplot(111, projection='3d') ax.view_init(elev=30, azim=135)
plt.figure創(chuàng)建一個(gè)圖形窗口,figsize設(shè)置圖形的大小,dpi設(shè)置圖形的分辨率。fig.add_subplot添加一個(gè)子圖,projection='3d'表示這是一個(gè)三維圖形。ax.view_init設(shè)置三維圖形的視角,elev是仰角,azim是方位角。
顏色映射
norm = plt.Normalize(vmin=np.min(z_height), vmax=np.max(z_height)) cmap = plt.cm.viridis colors = cmap(norm(z_height.flatten()))
plt.Normalize將高度數(shù)據(jù)歸一化到 [0, 1] 范圍內(nèi),方便后續(xù)的顏色映射。plt.cm.viridis是一種顏色映射方案,它會(huì)根據(jù)歸一化后的值生成對(duì)應(yīng)的顏色。cmap(norm(z_height.flatten()))將歸一化后的高度數(shù)據(jù)映射為顏色,flatten是將二維數(shù)組展平為一維數(shù)組。
繪制柱子
for i in range(len(x.flatten())):
ax.bar3d(
x.flatten()[i], y.flatten()[i], z.flatten()[i],
0.5, 0.5, z_height.flatten()[i],
color=colors[i],
edgecolor='black',
linewidth=0.3,
shade=True
)ax.bar3d是繪制三維柱狀圖的函數(shù)。x.flatten()[i]、y.flatten()[i]和z.flatten()[i]是柱子的底部坐標(biāo)。0.5, 0.5是柱子在 x 和 y 方向上的寬度。z_height.flatten()[i]是柱子的高度。color=colors[i]設(shè)置柱子的顏色。edgecolor='black'設(shè)置柱子邊緣的顏色。linewidth=0.3設(shè)置邊緣的線寬。shade=True開(kāi)啟陰影效果,使圖形更加立體。
坐標(biāo)軸標(biāo)簽和標(biāo)題
ax.set_xlabel('變量1', fontsize=12, labelpad=10)
ax.set_ylabel('變量2', fontsize=12, labelpad=10)
ax.set_zlabel('值', fontsize=12, labelpad=10)
ax.set_title('3D柱狀圖示例', fontsize=14, pad=20)ax.set_xlabel、ax.set_ylabel和ax.set_zlabel分別設(shè)置 x、y 和 z 軸的標(biāo)簽。fontsize設(shè)置標(biāo)簽的字體大小。labelpad設(shè)置標(biāo)簽與坐標(biāo)軸的距離。ax.set_title設(shè)置圖形的標(biāo)題。
圖例
legend_elements = [plt.Line2D([0], [0], marker='o', color='w', label=f'類別{i+1}',
markerfacecolor=colors[i % len(colors)], markersize=10)
for i in range(len(np.unique(z_height.flatten())))]
ax.legend(handles=legend_elements, loc='upper left')plt.Line2D創(chuàng)建一個(gè)圖例元素,marker='o'表示用圓形標(biāo)記,color='w'表示標(biāo)記的邊框顏色為白色,markerfacecolor設(shè)置標(biāo)記的填充顏色,markersize設(shè)置標(biāo)記的大小。label=f'類別{i+1}'設(shè)置圖例的標(biāo)簽。colors[i % len(colors)]根據(jù)類別數(shù)量循環(huán)使用顏色。ax.legend添加圖例,handles是圖例元素列表,loc設(shè)置圖例的位置。
網(wǎng)格和背景
ax.grid(True) ax.xaxis.pane.fill = False ax.yaxis.pane.fill = False ax.zaxis.pane.fill = False
ax.grid(True)開(kāi)啟網(wǎng)格。ax.xaxis.pane.fill = False等語(yǔ)句將坐標(biāo)軸的背景填充關(guān)閉,使圖形更加簡(jiǎn)潔。
顯示圖形
plt.tight_layout() plt.show()
plt.tight_layout():自動(dòng)調(diào)整子圖參數(shù),使其填充整個(gè)圖形區(qū)域,避免標(biāo)簽或標(biāo)題被裁剪。這在圖形中有多個(gè)子圖或標(biāo)簽較長(zhǎng)時(shí)特別有用,可以確保布局更加美觀。plt.show():顯示最終繪制的圖形。此函數(shù)會(huì)打開(kāi)一個(gè)窗口,展示完整的三維柱狀圖,包括所有柱子、標(biāo)簽、圖例和網(wǎng)格等元素。
四、運(yùn)行代碼
將上述代碼復(fù)制到你的 Python 環(huán)境中(比如 Jupyter Notebook 或 PyCharm),運(yùn)行代碼后,你會(huì)看到一個(gè)三維柱狀圖。圖中的柱子高度表示數(shù)據(jù)的大小,顏色表示不同的類別,圖例會(huì)顯示每個(gè)類別的顏色對(duì)應(yīng)關(guān)系,事例如下圖:

如果你在運(yùn)行過(guò)程中遇到任何問(wèn)題,比如報(bào)錯(cuò)或顯示不正確,可以檢查以下幾點(diǎn):
確保安裝了 matplotlib 和 numpy 庫(kù)。
檢查代碼中是否有拼寫(xiě)錯(cuò)誤。
確保你的 Python 環(huán)境支持中文顯示。
完整代碼如下:
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import rcParams
# 設(shè)置支持中文的字體為黑體(SimHei)
rcParams['font.family'] = 'SimHei'
rcParams['axes.unicode_minus'] = False
# 數(shù)據(jù)準(zhǔn)備
x = np.arange(1, 11)
y = np.arange(1, 11)
x, y = np.meshgrid(x, y)
z = np.zeros_like(x)
z_height = np.array([[5, 3, 8, 6, 7, 2, 9, 4, 5, 6],
[4, 5, 7, 8, 6, 3, 5, 2, 4, 3],
[7, 8, 6, 5, 4, 9, 3, 7, 8, 6],
[2, 4, 3, 7, 8, 5, 6, 9, 4, 5],
[6, 7, 8, 5, 4, 3, 2, 6, 7, 8],
[3, 2, 5, 4, 6, 7, 8, 5, 3, 2],
[8, 6, 7, 3, 2, 4, 5, 7, 8, 6],
[5, 4, 2, 6, 7, 8, 3, 5, 4, 2],
[9, 3, 7, 8, 6, 5, 4, 9, 3, 7],
[4, 5, 6, 7, 8, 9, 2, 4, 5, 6]])
# 圖形設(shè)置
fig = plt.figure(figsize=(10, 8), dpi=100)
ax = fig.add_subplot(111, projection='3d')
ax.view_init(elev=30, azim=135) # 更佳視角
# 顏色映射
norm = plt.Normalize(vmin=np.min(z_height), vmax=np.max(z_height))
cmap = plt.cm.viridis
colors = cmap(norm(z_height.flatten()))
# 繪制柱子
for i in range(len(x.flatten())):
ax.bar3d(
x.flatten()[i], y.flatten()[i], z.flatten()[i],
0.5, 0.5, z_height.flatten()[i],
color=colors[i],
edgecolor='black',
linewidth=0.3,
shade=True
)
# 坐標(biāo)軸標(biāo)簽
ax.set_xlabel('變量1', fontsize=12, labelpad=10)
ax.set_ylabel('變量2', fontsize=12, labelpad=10)
ax.set_zlabel('值', fontsize=12, labelpad=10)
# 標(biāo)題
ax.set_title('3D柱狀圖示例', fontsize=14, pad=20)
# 圖例
legend_elements = [plt.Line2D([0], [0], marker='o', color='w', label=f'類別{i+1}',
markerfacecolor=colors[i % len(colors)], markersize=10)
for i in range(len(np.unique(z_height.flatten())))]
ax.legend(handles=legend_elements, loc='upper left')
# 網(wǎng)格和背景
ax.grid(True)
ax.xaxis.pane.fill = False
ax.yaxis.pane.fill = False
ax.zaxis.pane.fill = False
plt.tight_layout()
plt.show()五、總結(jié)
通過(guò)本教程,你學(xué)會(huì)了如何使用 Python 繪制帶類別標(biāo)簽的三維柱狀圖。我們從數(shù)據(jù)準(zhǔn)備開(kāi)始,逐步介紹了如何設(shè)置圖形、繪制柱子、添加標(biāo)簽和圖例,并最終生成了一個(gè)酷炫的三維柱狀圖。這種圖表非常適合展示多變量數(shù)據(jù)之間的關(guān)系,尤其是當(dāng)你需要對(duì)數(shù)據(jù)進(jìn)行分類標(biāo)注時(shí)。
如果你對(duì)三維柱狀圖有更多想法或需求,比如添加動(dòng)畫(huà)效果、調(diào)整顏色映射等,可以繼續(xù)探索 matplotlib 的強(qiáng)大功能。
到此這篇關(guān)于使用Python打造帶類別標(biāo)簽的三維柱狀圖的文章就介紹到這了,更多相關(guān)Python三維柱狀圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python學(xué)習(xí)之基于Python的人臉識(shí)別技術(shù)學(xué)習(xí)
面部識(shí)別技術(shù)的應(yīng)用越來(lái)越廣泛,它廣泛應(yīng)用于安全系統(tǒng)、人機(jī)交互、社交媒體、醫(yī)療保健等領(lǐng)域。本文介紹了基于Python的人臉識(shí)別技術(shù),感興趣的小伙伴可以參考閱讀2023-03-03
基于Python自動(dòng)化實(shí)現(xiàn)Word文檔專業(yè)排版
在辦公自動(dòng)化領(lǐng)域,用 Python 處理 Word 文檔已經(jīng)是非常成熟和高效的方案了,本文將和大家使用Python實(shí)現(xiàn)自動(dòng)化Word文檔排版的相關(guān)知識(shí),希望對(duì)大家有所幫助2026-05-05
Python通過(guò)DOM和SAX方式解析XML的應(yīng)用實(shí)例分享
這篇文章主要介紹了Python通過(guò)DOM和SAX方式解析XML的應(yīng)用實(shí)例分享,針對(duì)這兩種解析方式Python都有相關(guān)的模塊可供使用,需要的朋友可以參考下2015-11-11
python GUI框架pyqt5 對(duì)圖片進(jìn)行流式布局的方法(瀑布流flowlayout)
這篇文章主要介紹了python GUI框架pyqt5 對(duì)圖片進(jìn)行流式布局的方法(瀑布流flowlayout),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
Python使用修飾器執(zhí)行函數(shù)的參數(shù)檢查功能示例
這篇文章主要介紹了Python使用修飾器執(zhí)行函數(shù)的參數(shù)檢查功能,結(jié)合具體實(shí)例形式分析了Python實(shí)現(xiàn)修飾器針對(duì)函數(shù)參數(shù)檢查的原理、步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-09-09
PyQt5簡(jiǎn)單讀取以及顯示圖片的應(yīng)用實(shí)例
我們?cè)谶M(jìn)行圖像處理時(shí),經(jīng)常會(huì)用到讀取圖片并顯示出來(lái)這樣的操作,下面這篇文章主要給大家介紹了關(guān)于PyQt5簡(jiǎn)單讀取以及顯示圖片應(yīng)用的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05

