最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Python繪制3D堆疊條形圖全解析

 更新時(shí)間:2025年06月25日 15:00:58   作者:Code_Verse  
在數(shù)據(jù)可視化的工具箱里,3D 圖表總能帶來(lái)眼前一亮的效果,本文就來(lái)和大家聊聊如何使用Python實(shí)現(xiàn)繪制3D 堆疊條形圖,感興趣的小伙伴可以了解下

在數(shù)據(jù)可視化的工具箱里,3D 圖表總能帶來(lái)眼前一亮的效果 —— 它突破了二維平面的限制,用立體空間展示多維度數(shù)據(jù)關(guān)系,讓復(fù)雜的數(shù)據(jù)層級(jí)一目了然。今天我們要解鎖的「3D 堆疊條形圖」,就是一種能同時(shí)呈現(xiàn)類(lèi)別、子類(lèi)別、數(shù)值大小的強(qiáng)大可視化工具,特別適合展示具有分層結(jié)構(gòu)的數(shù)據(jù)。無(wú)論是商業(yè)報(bào)表中的多維度業(yè)績(jī)分析,還是科研數(shù)據(jù)中的多指標(biāo)對(duì)比,它都能讓你的數(shù)據(jù)呈現(xiàn)瞬間高級(jí)起來(lái)~

為什么選擇 3D 堆疊條形圖

先聊聊這種圖表的獨(dú)特優(yōu)勢(shì):

  • 三維空間的信息密度:x 軸和 y 軸分別代表兩個(gè)獨(dú)立維度(如產(chǎn)品類(lèi)別、時(shí)間區(qū)間),z 軸通過(guò)堆疊高度展示多層數(shù)據(jù)(如不同子項(xiàng)的數(shù)值),單張圖表可容納傳統(tǒng)二維圖表 3 倍以上的信息。
  • 堆疊邏輯的直觀性:每個(gè)基底條形代表 x-y 軸交點(diǎn)的整體數(shù)據(jù),不同顏色的層疊部分清晰展示各子項(xiàng)的貢獻(xiàn)度,比如 “總銷(xiāo)售額 = 產(chǎn)品 A + 產(chǎn)品 B + 產(chǎn)品 C” 的結(jié)構(gòu)一目了然。
  • 視覺(jué)沖擊力強(qiáng):立體效果讓數(shù)據(jù)差異更具沖擊力,配合顏色和透明度調(diào)整,即使是復(fù)雜數(shù)據(jù)集也能輕松駕馭。

適合場(chǎng)景舉例:

  • 企業(yè)季度報(bào)告:按「地區(qū)(x 軸)- 產(chǎn)品(y 軸)」展示「銷(xiāo)售額 / 成本 / 利潤(rùn)」的三層堆疊。
  • 學(xué)術(shù)研究:在「實(shí)驗(yàn)條件(x 軸)- 樣本類(lèi)型(y 軸)」上展示「指標(biāo) 1 / 指標(biāo) 2 / 指標(biāo) 3」的數(shù)值對(duì)比。
  • 教育數(shù)據(jù)分析:按「年級(jí)(x 軸)- 科目(y 軸)」呈現(xiàn)「及格率 / 優(yōu)秀率 / 平均分」的多層數(shù)據(jù)。

代碼實(shí)現(xiàn):從數(shù)據(jù)到 3D 世界的搭建

先奉上完整代碼,我們將像拆解樂(lè)高積木一樣解析每個(gè)關(guān)鍵模塊:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# Generate random data
num_x = 10
num_y = 10
num_stacks = 5
data = np.random.randint(0, 10, size=(num_x, num_y, num_stacks))

# Set up figure and 3D axis
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

x_positions = np.arange(1, num_x + 1)
y_positions = np.arange(1, num_y + 1)
dx = dy = 0.5  # width and depth of the bars

# Plot stacked bars
for i, x in enumerate(x_positions):
    for j, y in enumerate(y_positions):
        bottom = 0
        for k in range(num_stacks):
            dz = data[i, j, k]
            ax.bar3d(x, y, bottom, dx, dy, dz, alpha=0.8)
            bottom += dz

# Set labels and title
ax.set_xlabel('Variable1')
ax.set_ylabel('Variable2')
ax.set_zlabel('Variable3')
ax.set_title('3D Stacked Bar Plot')

plt.show()

核心代碼逐行解析

階段一:數(shù)據(jù)準(zhǔn)備 —— 搭建數(shù)據(jù)立方體

num_x = 10
num_y = 10
num_stacks = 5
data = np.random.randint(0, 10, size=(num_x, num_y, num_stacks))
  • 這是用戶(hù)替換數(shù)據(jù)的核心區(qū)域!當(dāng)前代碼生成了一個(gè) 10x10x5 的三維數(shù)組,代表:
    • x 軸有 10 個(gè)類(lèi)別(num_x),比如 10 個(gè)銷(xiāo)售區(qū)域
    • y 軸有 10 個(gè)子類(lèi)別(num_y),比如 10 種產(chǎn)品
    • 每個(gè) (x,y) 交點(diǎn)有 5 層堆疊數(shù)據(jù)(num_stacks),比如 5 個(gè)季度的指標(biāo)
  • 如何替換自己的數(shù)據(jù)?
    • 如果你有現(xiàn)成的三維數(shù)組(形狀為 [num_x, num_y, num_stacks]),直接替換data即可:
data = your_3d_data  # 例如從文件讀取的numpy數(shù)組

若數(shù)據(jù)是二維表格(如 Excel 中的長(zhǎng)表格),需要先轉(zhuǎn)換為三維結(jié)構(gòu)。例如,假設(shè)你的數(shù)據(jù)是:

Variable1Variable2Stack1Stack2Stack3
11532
12461
...............

可以用pandas重組數(shù)據(jù): 

import pandas as pd
df = pd.read_csv('your_data.csv')
num_x = df['Variable1'].nunique()
num_y = df['Variable2'].nunique()
num_stacks = 3  # 假設(shè)堆疊層數(shù)為3
data = df.pivot_table(
    values=['Stack1', 'Stack2', 'Stack3'],
    index='Variable1',
    columns='Variable2'
).values.transpose(1, 0, 2)  # 調(diào)整維度順序?yàn)?num_x, num_y, num_stacks)

階段二:場(chǎng)景搭建 —— 創(chuàng)建 3D 畫(huà)布 

  • projection='3d'是激活三維坐標(biāo)軸的關(guān)鍵,Matplotlib 的Axes3D類(lèi)會(huì)負(fù)責(zé)處理立體空間的渲染。
  • 可以通過(guò)fig.set_size_inches(10, 8)調(diào)整畫(huà)布大小,數(shù)據(jù)量較大時(shí)建議增大畫(huà)布,避免條形過(guò)于擁擠。

階段三:主體繪制 —— 堆疊條形的魔法循環(huán)

x_positions = np.arange(1, num_x + 1)
y_positions = np.arange(1, num_y + 1)
dx = dy = 0.5  # 條形的寬度和深度
  • x_positionsy_positions定義了每個(gè)基底條形在 x-y 平面的位置,默認(rèn)從 1 開(kāi)始(避免坐標(biāo) 0 導(dǎo)致的視覺(jué)混淆)。
  • dxdy控制條形的寬度和深度(三維中的 x 和 y 方向尺寸),數(shù)值越小,條形越纖細(xì);建議設(shè)置為小于 1 的值(如 0.8),留出條形間的間隔。
for i, x in enumerate(x_positions):
    for j, y in enumerate(y_positions):
        bottom = 0  # 堆疊基底高度初始化為0
        for k in range(num_stacks):
            dz = data[i, j, k]  # 第k層的高度
            ax.bar3d(x, y, bottom, dx, dy, dz, alpha=0.8)  # 繪制單層條形
            bottom += dz  # 基底高度累加上當(dāng)前層高度

這是三層嵌套循環(huán),核心邏輯是:

  • 外層循環(huán)遍歷 x 軸每個(gè)類(lèi)別(i 對(duì)應(yīng) x_positions 的索引)
  • 中層循環(huán)遍歷 y 軸每個(gè)子類(lèi)別(j 對(duì)應(yīng) y_positions 的索引)
  • 內(nèi)層循環(huán)遍歷每個(gè)堆疊層(k 對(duì)應(yīng) num_stacks),從基底開(kāi)始逐層疊加

ax.bar3d的參數(shù)解析:

  • x, y:條形在 x-y 平面的中心坐標(biāo)
  • bottom:條形底部在 z 軸的起始位置(即下層條形的頂部高度)
  • dx, dy:條形在 x 和 y 方向的寬度(建議保持一致以避免視覺(jué)變形)
  • dz:條形在 z 軸的高度(即當(dāng)前層的數(shù)據(jù)值)
  • alpha=0.8:設(shè)置透明度,避免多層堆疊時(shí)顏色過(guò)深遮擋數(shù)據(jù)

細(xì)節(jié)優(yōu)化

1. 顏色定制:給每層條形穿上不同的 “外衣”

當(dāng)前代碼使用默認(rèn)顏色,可能導(dǎo)致多層堆疊時(shí)難以區(qū)分??梢酝ㄟ^(guò)color參數(shù)自定義每層顏色:

# 定義每層的顏色(建議使用明度差異大的顏色)
stack_colors = ['#FF5733', '#33FF57', '#3357FF', '#FF33F7', '#F7FF33']

# 在繪制時(shí)傳入顏色
ax.bar3d(x, y, bottom, dx, dy, dz, color=stack_colors[k], alpha=0.8)

2. 坐標(biāo)軸優(yōu)化:讓標(biāo)簽清晰易讀 

ax.set_xticks(x_positions)  # 設(shè)置x軸刻度為實(shí)際位置
ax.set_yticks(y_positions)  # 設(shè)置y軸刻度為實(shí)際位置
ax.tick_params(axis='x', labelsize=8, rotation=15)  # 旋轉(zhuǎn)x軸標(biāo)簽避免重疊
ax.tick_params(axis='y', labelsize=8, rotation=10)  # 微調(diào)y軸標(biāo)簽角度

3. 視角調(diào)整:找到最佳觀察角度 

ax.view_init(elev=30, azim=45)  # elev:仰角,azim:方位角
# 常用組合:
# 正前方視角:elev=90, azim=0
# 俯視視角:elev=60, azim=30

4. 添加數(shù)據(jù)標(biāo)簽:讓數(shù)值一目了然(進(jìn)階) 

for i, x in enumerate(x_positions):
    for j, y in enumerate(y_positions):
        bottom = 0
        for k in range(num_stacks):
            dz = data[i, j, k]
            # 計(jì)算條形頂部中心坐標(biāo)
            x_center = x + dx/2
            y_center = y + dy/2
            z_top = bottom + dz/2
            ax.text(x_center, y_center, z_top, f'{dz}', ha='center', va='center')
            bottom += dz

5. 背景與網(wǎng)格:提升視覺(jué)舒適度 

ax.grid(False)  # 關(guān)閉默認(rèn)網(wǎng)格,避免干擾
ax.xaxis.set_pane_color((1.0, 1.0, 1.0, 0.0))  # 透明化坐標(biāo)軸背景
ax.yaxis.set_pane_color((1.0, 1.0, 1.0, 0.0))
ax.zaxis.set_pane_color((1.0, 1.0, 1.0, 0.0))

應(yīng)用場(chǎng)景:3D 堆疊圖的實(shí)戰(zhàn)案例

案例 1:電商平臺(tái)多維度銷(xiāo)售分析

  • x 軸:省份(10 個(gè)地區(qū))
  • y 軸:產(chǎn)品類(lèi)別(10 種商品)
  • 堆疊層:銷(xiāo)售額、成本、利潤(rùn)、訂單量、退貨量(5 層數(shù)據(jù))
    通過(guò)顏色區(qū)分各層,能快速定位 “高銷(xiāo)售額但高退貨” 的異常區(qū)域,或 “低成本高利潤(rùn)” 的明星產(chǎn)品組合。

案例 2:氣候數(shù)據(jù)多指標(biāo)對(duì)比

  • x 軸:月份(12 個(gè)月)
  • y 軸:城市(5 個(gè)代表城市)
  • 堆疊層:降水量、平均氣溫、濕度、風(fēng)速、日照時(shí)長(zhǎng)(5 層數(shù)據(jù))
    立體展示讓不同城市的氣候特征對(duì)比更直觀,比如 “某城市夏季降水量遠(yuǎn)高于其他城市” 的模式一目了然。

案例 3:教育領(lǐng)域?qū)W生表現(xiàn)分析

  • x 軸:學(xué)科(語(yǔ)文、數(shù)學(xué)、英語(yǔ)等 8 科)
  • y 軸:班級(jí)(6 個(gè)班級(jí))
  • 堆疊層:平均分、優(yōu)秀率、及格率、低分率、缺考率(5 層數(shù)據(jù))
    幫助教育管理者快速發(fā)現(xiàn) “某班級(jí)數(shù)學(xué)及格率低但優(yōu)秀率高” 的兩極分化現(xiàn)象,或 “某學(xué)科全年級(jí)缺考率異常” 的問(wèn)題。

避坑指南:3D 圖表的常見(jiàn)問(wèn)題與解決方案

數(shù)據(jù)遮擋問(wèn)題

  • 現(xiàn)象:上層條形遮擋下層數(shù)據(jù),尤其是堆疊層數(shù)多或透明度低時(shí)。
  • 解決方案:
    • 增加透明度(alpha=0.6
    • 調(diào)整視角,讓上層條形 “傾斜” 露出下層(通過(guò)view_init設(shè)置仰角和方位角)
    • 減少堆疊層數(shù)(建議不超過(guò) 6 層,超過(guò)后信息會(huì)過(guò)載)

性能卡頓

  • 現(xiàn)象:數(shù)據(jù)量過(guò)大(如 20x20x10)時(shí),繪圖速度變慢。
  • 解決方案:
    • 簡(jiǎn)化數(shù)據(jù):對(duì)稀疏數(shù)據(jù)進(jìn)行聚合(如求平均值)
    • 降低圖形復(fù)雜度:減小dx/dy值,或關(guān)閉不必要的網(wǎng)格和背景渲染

顏色混淆

  • 現(xiàn)象:相近顏色的堆疊層難以區(qū)分。
  • 解決方案:
    • 使用色盲友好調(diào)色板(如plt.cm.tab10
    • 在每層條形頂部添加數(shù)據(jù)標(biāo)簽(見(jiàn)前文代碼)
    • 在圖例中說(shuō)明各層顏色對(duì)應(yīng)的含義(需額外編寫(xiě)圖例代碼)

進(jìn)階玩法:讓 3D 圖表更動(dòng)態(tài)

1. 交互式旋轉(zhuǎn)與縮放

Matplotlib 默認(rèn)支持鼠標(biāo)交互:

左鍵拖動(dòng):旋轉(zhuǎn)視角

右鍵拖動(dòng):平移畫(huà)布

滾輪:縮放視圖

配合plt.ion()(交互模式),可以在 Jupyter Notebook 中實(shí)時(shí)調(diào)整視角。

2. 動(dòng)畫(huà)效果(生成 GIF)

from matplotlib.animation import FuncAnimation

def update(frame):
    ax.view_init(elev=30, azim=frame)  # 動(dòng)態(tài)改變方位角
    return fig,

ani = FuncAnimation(fig, update, frames=np.linspace(0, 360, 30), repeat=True)
ani.save('3d_bar_animation.gif', writer='pillow')

3. 與其他圖表結(jié)合

將 3D 堆疊圖與 2D 趨勢(shì)圖組合,形成多視圖儀表盤(pán):

fig, (ax3d, ax2d) = plt.subplots(1, 2, figsize=(15, 6), subplot_kw={'projection': '3d'})
# 在ax3d繪制堆疊圖,在ax2d繪制x軸總和的折線圖

結(jié)語(yǔ):讓數(shù)據(jù)在三維空間中舞動(dòng)

3D 堆疊條形圖就像一個(gè)數(shù)據(jù)舞臺(tái),每個(gè)條形都是舞臺(tái)上的舞者,用高度和顏色演繹數(shù)據(jù)的故事。通過(guò)今天的教程,你已經(jīng)掌握了從數(shù)據(jù)準(zhǔn)備到細(xì)節(jié)優(yōu)化的全流程,現(xiàn)在只差替換成你自己的數(shù)據(jù)啦!

替換數(shù)據(jù)的關(guān)鍵步驟回顧:

  • 確保你的數(shù)據(jù)是三維數(shù)組,形狀為[num_x, num_y, num_stacks]
  • 替換代碼中data = np.random.randint(...)這一行,直接賦值為你的數(shù)據(jù)
  • 根據(jù)數(shù)據(jù)含義修改坐標(biāo)軸標(biāo)簽(set_xlabel/set_ylabel/set_zlabel)和標(biāo)題

快去試試吧!無(wú)論是分析商業(yè)數(shù)據(jù)還是科研成果,這種立體可視化方式都會(huì)讓你的報(bào)告瞬間提升一個(gè)檔次~

到此這篇關(guān)于使用Python繪制3D堆疊條形圖全解析的文章就介紹到這了,更多相關(guān)Python繪制3D堆疊條形圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python+Flask編寫(xiě)一個(gè)簡(jiǎn)單的行人檢測(cè)API

    Python+Flask編寫(xiě)一個(gè)簡(jiǎn)單的行人檢測(cè)API

    Flask是一個(gè)微型的Python開(kāi)發(fā)的Web框架,基于Werkzeug WSGI工具箱和Jinja2模板引擎。本文將利用Flask框子編寫(xiě)一個(gè)簡(jiǎn)單的行人檢測(cè)API,感興趣的可以了解一下
    2022-03-03
  • 一起來(lái)了解python的基本輸入和輸出

    一起來(lái)了解python的基本輸入和輸出

    這篇文章主要為大家詳細(xì)介紹了python的基本輸入和輸出,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • python 繪制斜率圖進(jìn)行對(duì)比分析

    python 繪制斜率圖進(jìn)行對(duì)比分析

    這篇文章主要介紹了python 繪制斜率圖進(jìn)行對(duì)比分析的實(shí)例,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-03-03
  • Python之re操作方法(詳解)

    Python之re操作方法(詳解)

    下面小編就為大家?guī)?lái)一篇Python之re操作方法(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • python判斷一個(gè)集合是否包含了另外一個(gè)集合中所有項(xiàng)的方法

    python判斷一個(gè)集合是否包含了另外一個(gè)集合中所有項(xiàng)的方法

    這篇文章主要介紹了python判斷一個(gè)集合是否包含了另外一個(gè)集合中所有項(xiàng)的方法,涉及Python集合操作的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • 最新評(píng)論

    依兰县| 吉林省| 西乡县| 汕尾市| 都兰县| 武清区| 明光市| 平果县| 鄢陵县| 湖南省| 原阳县| 泉州市| 额尔古纳市| 武强县| 嘉峪关市| 冀州市| 淳化县| 甘德县| 景洪市| 武汉市| 兴隆县| 嘉峪关市| 腾冲县| 邻水| 休宁县| 星座| 东明县| 万荣县| 从江县| 乐清市| 桑植县| 西和县| 昆山市| 辽阳县| 曲松县| 漠河县| 鹤壁市| 大渡口区| 克拉玛依市| 防城港市| 花莲县|