使用Python打造帶類別標(biāo)簽的三維柱狀圖
一、帶類別標(biāo)簽的三維柱狀圖介紹
帶類別標(biāo)簽的三維柱狀圖是一種在三維空間中展示分類數(shù)據(jù)的可視化工具。它不僅能夠通過柱子的高度直觀地表示數(shù)據(jù)的大小,還能通過顏色或圖例區(qū)分不同的類別。這種圖表特別適合展示多組數(shù)據(jù)之間的對比關(guān)系,例如不同類別在某個變量上的表現(xiàn),或者多個類別在不同條件下的差異。
特點
- 三維空間展示:通過 x、y、z 三個坐標(biāo)軸,展示數(shù)據(jù)的多維度信息。
- 分類標(biāo)注:通過顏色或圖例區(qū)分不同的類別,使圖表更具表現(xiàn)力。
- 直觀對比:柱子的高度直觀地反映了數(shù)據(jù)的大小,方便進行對比分析。
應(yīng)用場景
- 數(shù)據(jù)分析:展示不同類別在某個指標(biāo)上的表現(xiàn),例如不同產(chǎn)品的銷售額。
- 科學(xué)研究:比較不同實驗組在某個變量上的差異,例如不同藥物的療效。
- 商業(yè)報告:呈現(xiàn)市場調(diào)研結(jié)果,例如不同地區(qū)的消費偏好。
二、數(shù)據(jù)類型準(zhǔn)備
在繪制帶類別標(biāo)簽的三維柱狀圖之前,我們需要準(zhǔn)備以下幾類數(shù)據(jù):
- 坐標(biāo)數(shù)據(jù):用于確定柱子在三維空間中的位置。通常包括 x、y 坐標(biāo),它們可以是連續(xù)的數(shù)值,也可以是離散的類別。
- 高度數(shù)據(jù):表示柱子的高度,反映了數(shù)據(jù)的大小。它是一個二維數(shù)組,每個元素對應(yīng)一個柱子的高度。
- 類別標(biāo)簽(可選):如果需要對柱子進行分類標(biāo)注,還需要準(zhǔn)備類別標(biāo)簽。這些標(biāo)簽可以是數(shù)字、字符串等,用于區(qū)分不同類別的柱子。
在代碼中,數(shù)據(jù)要準(zhǔn)備好:
x和y是坐標(biāo)數(shù)據(jù),通過np.arange和np.meshgrid生成了一個 10×10 的網(wǎng)格。z_height是高度數(shù)據(jù),是一個 10×10 的二維數(shù)組,每個元素表示對應(yīng)位置柱子的高度。- 類別標(biāo)簽沒有明確給出,但從
z_height的值可以推斷出不同的高度對應(yīng)不同的類別。
三、代碼解釋
以下是代碼的詳細解釋,幫助你理解每一步的作用。
導(dǎo)入必要的庫
import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d import Axes3D from matplotlib import rcParams
matplotlib.pyplot是用于繪圖的庫。numpy是用于數(shù)值計算的庫,方便生成和操作數(shù)據(jù)。mpl_toolkits.mplot3d提供了三維繪圖的功能。rcParams用于設(shè)置全局的繪圖參數(shù),比如字體和負(fù)號顯示。
設(shè)置支持中文的字體
rcParams['font.family'] = 'SimHei' rcParams['axes.unicode_minus'] = False
這兩行代碼的作用是讓圖表支持中文顯示,并且正確顯示負(fù)號。如果不設(shè)置,可能會出現(xiàn)中文亂碼或負(fù)號顯示不正常的情況。
數(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是通過np.arange生成的從 1 到 10 的數(shù)組,表示 x 和 y 坐標(biāo)。np.meshgrid將x和y轉(zhuǎn)換為網(wǎng)格形式,生成一個二維數(shù)組,方便后續(xù)繪制柱子的位置。z是一個全為零的二維數(shù)組,表示柱子的底部在 z 軸上的位置。z_height是一個二維數(shù)組,表示每個柱子的高度。
圖形設(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)建一個圖形窗口,figsize設(shè)置圖形的大小,dpi設(shè)置圖形的分辨率。fig.add_subplot添加一個子圖,projection='3d'表示這是一個三維圖形。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是一種顏色映射方案,它會根據(jù)歸一化后的值生成對應(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開啟陰影效果,使圖形更加立體。
坐標(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)建一個圖例元素,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)開啟網(wǎng)格。ax.xaxis.pane.fill = False等語句將坐標(biāo)軸的背景填充關(guān)閉,使圖形更加簡潔。
顯示圖形
plt.tight_layout() plt.show()
plt.tight_layout():自動調(diào)整子圖參數(shù),使其填充整個圖形區(qū)域,避免標(biāo)簽或標(biāo)題被裁剪。這在圖形中有多個子圖或標(biāo)簽較長時特別有用,可以確保布局更加美觀。plt.show():顯示最終繪制的圖形。此函數(shù)會打開一個窗口,展示完整的三維柱狀圖,包括所有柱子、標(biāo)簽、圖例和網(wǎng)格等元素。
四、運行代碼
將上述代碼復(fù)制到你的 Python 環(huán)境中(比如 Jupyter Notebook 或 PyCharm),運行代碼后,你會看到一個三維柱狀圖。圖中的柱子高度表示數(shù)據(jù)的大小,顏色表示不同的類別,圖例會顯示每個類別的顏色對應(yīng)關(guān)系,事例如下圖:

如果你在運行過程中遇到任何問題,比如報錯或顯示不正確,可以檢查以下幾點:
確保安裝了 matplotlib 和 numpy 庫。
檢查代碼中是否有拼寫錯誤。
確保你的 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é)
通過本教程,你學(xué)會了如何使用 Python 繪制帶類別標(biāo)簽的三維柱狀圖。我們從數(shù)據(jù)準(zhǔn)備開始,逐步介紹了如何設(shè)置圖形、繪制柱子、添加標(biāo)簽和圖例,并最終生成了一個酷炫的三維柱狀圖。這種圖表非常適合展示多變量數(shù)據(jù)之間的關(guān)系,尤其是當(dāng)你需要對數(shù)據(jù)進行分類標(biāo)注時。
如果你對三維柱狀圖有更多想法或需求,比如添加動畫效果、調(diào)整顏色映射等,可以繼續(xù)探索 matplotlib 的強大功能。
到此這篇關(guān)于使用Python打造帶類別標(biāo)簽的三維柱狀圖的文章就介紹到這了,更多相關(guān)Python三維柱狀圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python?sklearn?中的?make_blobs()?函數(shù)示例詳解
make_blobs()?是?sklearn.datasets中的一個函數(shù),這篇文章主要介紹了Python?sklearn?中的?make_blobs()?函數(shù),本文結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2023-02-02
python,pycharm的環(huán)境變量設(shè)置方式
這篇文章主要介紹了python,pycharm的環(huán)境變量設(shè)置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01
Django框架實現(xiàn)的普通登錄案例【使用POST方法】
這篇文章主要介紹了Django框架實現(xiàn)的普通登錄案例,結(jié)合實例形式分析了Django框架使用POST方法進行頁面登錄、校驗等相關(guān)操作技巧,需要的朋友可以參考下2019-05-05
python中array數(shù)組添加一行或一列數(shù)據(jù)的具體實現(xiàn)
這篇文章主要給大家介紹了關(guān)于python中array數(shù)組添加一行或一列數(shù)據(jù)的具體實現(xiàn),最近經(jīng)常使用到數(shù)組方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2023-09-09

