查看全课大纲(第 84 / 101 节)
  1. 1.数据分析基本概念
  2. 2.学习数据分析的一般路线
  3. 3.数据分析的流程
  4. 4.数据类型
  5. 5.环境部署(1)
  6. 6.环境部署(2)
  7. 7.课程介绍
  8. 8.TXT文件操作
  9. 9.JSON文件操作
  10. 10.CSV文件操作
  11. 11.Excel文件操作
  12. 12.数据库及SQL常用语法
  13. 13.数据库基本操作
  14. 14.数据库多表连接
  15. 15.实战:欧洲职业足球数据库分析
  16. 16.爬虫简介
  17. 17.URL管理模块
  18. 18.网页下载模块
  19. 19.网页解析模块(1)
  20. 20.网页解析模块(2)
  21. 21.Scrapy简介
  22. 22.Scrapy使用步骤(1)
  23. 23.Scrapy使用步骤(2)
  24. 24.Scrapy使用步骤(3)
  25. 25.Scrapy使用步骤(4)
  26. 26.实战:获取国内城市空气质量指数数据
  27. 27.NumPy和SciPy介绍
  28. 28.多维数组
  29. 29.多维数组操作
  30. 30.NumPy的常用方法
  31. 31.向量化介绍
  32. 32.向量化及通用函数
  33. 33.实战:2016美国大选分析
  34. 34.数据结构-Series
  35. 35.数据结构-DataFrame
  36. 36.数据结构-Index
  37. 37.Series的索引操作
  38. 38.DataFrame的索引操作
  39. 39.索引操作总结
  40. 40.运算与对齐
  41. 41.函数应用操作(1) -- map
  42. 42.函数应用操作 (2) -- apply applymap
  43. 43.文件读写操作
  44. 44.排序操作
  45. 45.数据清洗--处理缺失数据
  46. 46.数据清洗--处理重复数据
  47. 47.数据清洗--替换数据
  48. 48.常用统计方法(1) -- describe quantile
  49. 49.常用统计方法(2) -- sum mean median count
  50. 50.常用统计方法(3) -- max min idxmax idxmin
  51. 51.常用统计方法(4) -- mad var std cumsum
  52. 52.实战:全球食品数据分析
  53. 53.层级索引
  54. 54.分组与聚合介绍
  55. 55.分组操作(1) -- GroupBy对象及常用聚合操作
  56. 56.分组操作(2) -- 自定义分组及聚合操作
  57. 57.透视表介绍
  58. 58.透视表操作
  59. 59.数据规整(1) -- 数据合并concat
  60. 60.数据规整(2) -- 数据连接merge
  61. 61.数据重构(3) -- 数据重构stack unstack
  62. 62.实战:互联网电影资料库分析
  63. 63.探索性数据分析EDA介绍
  64. 64.EDA的目的
  65. 65.EDA常用工具
  66. 66.Matplotlib绘图基本介绍
  67. 67.Matplotlib画布
  68. 68.散点图和柱状图的绘制
  69. 69.直方图的绘制
  70. 70.矩阵绘图
  71. 71.子图的使用
  72. 72.Matplotlib颜色、标记、线型
  73. 73.Matplotlib坐标刻度、标签、图例、标题
  74. 74.Seaborn介绍
  75. 75.数据集分布可视化(1) -- 单变量分布、双变量分布
  76. 76.数据集分布可视化(2) -- 变量关系可视化
  77. 77.类别数据可视化 -- 类别散布图、类别内数据分布、类别内统计图
  78. 78.交互式数据可视化工具Bokeh介绍
  79. 79.Bokeh绘制散点图、柱状图、盒子图、弦图
  80. 80.Bokeh绘制常用图形元素
  81. 81.3D绘图 -- mplot3d
  82. 82.3D曲线可视化
  83. 83.3D散点图可视化
  84. 84.3D柱状图可视化
  85. 85.Pandas绘图
  86. 86.实战:Lending Club借贷数据探索性分析及可视化
  87. 87.机器学习介绍及应用场景
  88. 88.机器学习建模介绍 (1) -- 分类
  89. 89.机器学习建模介绍 (2) -- 回归
  90. 90.机器学习建模介绍 (3) -- 聚类
  91. 91.机器学习分类
  92. 92.机器学习工具scikit-learn
  93. 93.使用scikit-learn的流程
  94. 94.数据集准备及划分
  95. 95.模型选择
  96. 96.数据预处理及特征工程
  97. 97.过拟合与欠拟合
  98. 98.模型调参介绍
  99. 99.模型调参方法
  100. 100.模型测试及评价
  101. 101.实战:通过移动设备行为数据预测性别和年龄

3D柱状图可视化

约 4 分钟

📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)

小象实战讲义 · Python数据分析实战

在数据可视化中,3D柱状图能够同时展示三个维度的信息,常用于对比不同类别在不同条件下的数值表现。本节将学习如何使用Matplotlib的Axes3D.bar方法创建3D柱状图,理解其参数含义,并掌握调整坐标轴以获得理想显示效果的技巧。

💡 核心导读

  • 3D柱状图的核心方法:Axes3D.bar(left, height, zs, zdir)
  • 参数解析:left确定柱子在第一根轴的位置,height是柱子的长度(数据值),zs和zdir共同确定柱子沿哪根轴延伸、在哪根轴定位
  • 分组柱状图的实现:通过不同的zs值在同一图表中展示多组数据
  • 坐标轴角色调整:通过改变zdir参数,可以把柱子的延伸方向(height)绑定到不同的坐标轴

3D柱状图的基本原理

3D柱状图与之前学习的3D曲线图、3D散点图在参数传递上有所不同。Axes3D.bar方法接受四个关键参数,其官方语义是:zdir 决定柱子的延伸方向(height 画到哪根轴),zs 是柱子在剩下那根轴上的位置。

  • left:柱子在“第一根轴”上的位置(类比 2D 柱状图的 X 位置)
  • height:柱子的长度,即数据值——它绘制到哪根轴由 zdir 决定
  • zs:柱子“底面”在第三根轴上的位置(标量或与 left 等长的数组)
  • zdir:指定 height 绘制到哪根轴(‘x’、‘y’ 或 ‘z’)

三者的完整对应关系(务必记住这张映射表):

zdir 取值left 画到height 画到(柱子延伸方向)zs 是哪根轴上的位置
'z'(默认)X 轴Z 轴(竖直向上,最常见)Y 轴
'y'X 轴Y 轴Z 轴
'x'Y 轴X 轴Z 轴

以默认的 zdir='z' 为例:left 和 zs 固定了柱子底面在 XY 平面上的位置,height 决定柱子沿竖直的 Z 轴延伸的高度。

import numpy as np
import matplotlib
matplotlib.use('Agg')  # 使用无界面后端
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 准备数据:10个项目在两个条件下的表现
x = np.arange(10)  # 项目编号:0到9
# 硬编码两组数据,避免随机数导致输出不一致
y1 = [0.45, 0.7, 0.86, 0.47, 0.26, 0.82, 0.23, 0.63, 0.1, 0.67]  # 条件A
y2 = [0.54, 0.06, 0.17, 0.48, 0.25, 0.89, 0.77, 0.58, 0.08, 0.04]  # 条件B

print("项目编号 (x):", x)
print("条件A数据 (y1):", np.array(y1))
print("条件B数据 (y2):", np.array(y2))
项目编号 (x): [0 1 2 3 4 5 6 7 8 9]
条件A数据 (y1): [0.45 0.7  0.86 0.47 0.26 0.82 0.23 0.63 0.1  0.67]
条件B数据 (y2): [0.54 0.06 0.17 0.48 0.25 0.89 0.77 0.58 0.08 0.04]

创建基础3D柱状图

现在使用Axes3D.bar方法绘制分组柱状图。我们将两个条件的数据分别放置在Y轴的不同位置上(Y=0和Y=1),形成两组并排的柱子。

import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 准备数据(硬编码)
x = np.arange(10)
y1 = [0.45, 0.7, 0.86, 0.47, 0.26, 0.82, 0.23, 0.63, 0.1, 0.67]
y2 = [0.54, 0.06, 0.17, 0.48, 0.25, 0.89, 0.77, 0.58, 0.08, 0.04]

# 创建图形和3D坐标轴
fig = plt.figure(figsize=(10, 7))
ax = fig.add_subplot(111, projection='3d')

# 绘制第一组数据(条件A),放置在 Y=0 的位置
# left=x(项目编号画到X轴),height=y1(数值沿Z轴延伸),zs=0(柱子在Y轴的位置),zdir='z'(height 绘制到 Z 轴,默认)
ax.bar(x, y1, zs=0, zdir='z', color='skyblue', alpha=0.8, label='条件A')

# 绘制第二组数据(条件B),放置在 Y=1 的位置
ax.bar(x, y2, zs=1, zdir='z', color='lightcoral', alpha=0.8, label='条件B')

# 设置坐标轴标签
ax.set_xlabel('项目编号 (X)')
ax.set_ylabel('条件 (Y)')
ax.set_zlabel('数值 (Z)')

# 设置Y轴刻度,显示两个条件的位置
ax.set_yticks([0, 1])
ax.set_yticklabels(['条件A', '条件B'])

# 添加图例
ax.legend()

# 显示图形(在实际讲义中,读者可自行使用plt.show()或fig.savefig())
plt.close(fig)  # 释放图形资源
print("3D分组柱状图创建完成:X轴=项目编号,Y轴=条件,Z轴=数值")
3D分组柱状图创建完成:X轴=项目编号,Y轴=条件,Z轴=数值

调整坐标轴角色:zdir=‘y’ 让柱子沿 Y 轴延伸

按照上面的映射表,把 zdir 改为 'y' 后,height(数据值)将不再竖直向上,而是沿水平 Y 轴延伸,zs 则变成柱子底面在 Z 轴上的位置——适合“俯视平面图”式的表达。我们仍用同一组数据演示这一差异:

import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 准备数据(硬编码,与上例相同)
x = np.arange(10)
y1 = [0.45, 0.7, 0.86, 0.47, 0.26, 0.82, 0.23, 0.63, 0.1, 0.67]
y2 = [0.54, 0.06, 0.17, 0.48, 0.25, 0.89, 0.77, 0.58, 0.08, 0.04]

fig = plt.figure(figsize=(10, 7))
ax = fig.add_subplot(111, projection='3d')

# zdir='y':height(数值)绘制到 Y 轴、沿 Y 方向延伸;zs 变为柱子在 Z 轴上的位置
# 条件A的柱子底面在 Z=0,条件B的柱子底面在 Z=1
ax.bar(left=x, height=y1, zs=0, zdir='y', color='skyblue', alpha=0.8, label='条件A')
ax.bar(left=x, height=y2, zs=1, zdir='y', color='lightcoral', alpha=0.8, label='条件B')

ax.set_xlabel('项目编号 (X)')
ax.set_ylabel('数值 (Y)')
ax.set_zlabel('条件 (Z)')

# 条件的位置现在体现在 Z 轴刻度上
ax.set_zticks([0, 1])
ax.set_zticklabels(['条件A', '条件B'])

ax.legend()
plt.close(fig)
print("zdir='y' 版本:height 沿 Y 轴延伸(数值在Y轴),条件刻度在 Z 轴")
zdir='y' 版本:height 沿 Y 轴延伸(数值在Y轴),条件刻度在 Z 轴

对比两个版本可以体会到 zdir 的真实作用:它不旋转视角,而是改变“数据画在哪根轴上”。同一组数据,zdir='z' 是竖立的柱子(数值沿 Z 轴),zdir='y' 则是沿水平 Y 轴延伸的“躺式”柱子——两种形态各有适用场景。

参数使用要点总结

import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 最小示例演示参数关系
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# 创建简单的3D柱状图:3根柱子
# left=[0,1,2]:柱子在X轴的位置
# height=[1,2,3]:柱子的长度(数据值,此处沿Z轴延伸)
# zs=0:所有柱子底面都在Y=0的位置
# zdir='z':height 绘制到 Z 轴(默认,柱子竖直向上)
ax.bar(left=[0, 1, 2], height=[1, 2, 3], zs=0, zdir='z')

ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.set_zlabel('Z轴')
ax.set_title('3D柱状图参数关系演示')

plt.close(fig)
print("3D柱状图核心参数(zdir='z' 默认):left=位置,height=数值,zs=柱子在Y轴的位置")
3D柱状图核心参数(zdir='z' 默认):left=位置,height=数值,zs=柱子在Y轴的位置

📝 动手练一练

  1. 概念辨析:在Axes3D.bar(left, height, zs, zdir='z')方法中,当zdir='y'时,参数left、height和zs分别对应哪个坐标轴?请描述此时柱子在三维空间中的定位方式。
👉 点击查看参考答案

按照官方映射表,当zdir='y'时:

  • left对应X轴:确定柱子沿X方向排开的位置
  • height对应Y轴:柱子的长度(数据值)沿水平 Y 轴方向延伸(而不是竖直向上)
  • zs对应Z轴:确定柱子底面在Z轴上的位置

此时,每根柱子的底面位于 XZ 平面上(由 (left, zs) 定位),由height确定柱子沿Y轴方向延伸的长度。例如,ax.bar([0,1,2], [1,2,3], zs=0, zdir='y')会在X=0,1,2且Z=0的位置,各绘制一根沿Y方向长度分别为1、2、3的“躺式”柱子。

  1. 动手实践:修改第一个示例代码,添加第三组数据(条件C),包含10个0.3到0.8之间的硬编码值,并将这组数据放置在Y=2的位置。观察三组数据的对比效果。
👉 点击查看参考答案
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

x = np.arange(10)
y1 = [0.45, 0.7, 0.86, 0.47, 0.26, 0.82, 0.23, 0.63, 0.1, 0.67]
y2 = [0.54, 0.06, 0.17, 0.48, 0.25, 0.89, 0.77, 0.58, 0.08, 0.04]
# 添加第三组数据(条件C)
y3 = [0.35, 0.42, 0.58, 0.31, 0.76, 0.49, 0.63, 0.37, 0.52, 0.68]

fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')

# 绘制三组数据(沿用第一个示例的形态:数值沿Z轴,条件刻度在Y轴)
ax.bar(x, y1, zs=0, zdir='z', color='skyblue', alpha=0.8, label='条件A')
ax.bar(x, y2, zs=1, zdir='z', color='lightcoral', alpha=0.8, label='条件B')
ax.bar(x, y3, zs=2, zdir='z', color='lightgreen', alpha=0.8, label='条件C')

ax.set_xlabel('项目编号 (X)')
ax.set_ylabel('条件 (Y)')
ax.set_zlabel('数值 (Z)')
ax.set_yticks([0, 1, 2])
ax.set_yticklabels(['条件A', '条件B', '条件C'])
ax.legend()

plt.close(fig)
print("成功添加第三组数据(条件C),三组数据分别在Y=0,1,2位置显示")
成功添加第三组数据(条件C),三组数据分别在Y=0,1,2位置显示

添加第三组数据后,图表会显示三排柱子,可以更直观地比较三个条件下各个项目的表现差异。这种分组柱状图特别适合展示多因素多水平的对比数据。

本章小结

本节学习了3D柱状图的创建方法,重点掌握了Axes3D.bar方法的参数使用和坐标轴角色调整技巧。3D柱状图通过增加一个维度,能够同时展示三类信息,在对比分析多因素数据时具有独特优势。

📋 行动清单

  • 使用Axes3D.bar(left, height, zs, zdir)创建基础的3D柱状图
  • 通过调整zs和zdir参数实现分组柱状图效果
  • 尝试交换坐标轴角色,从不同视角观察同一组数据
  • 在实际项目中应用3D柱状图展示三维数据关系

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 本节课件:3D柱状图可视化
    PDF · 265KB
    下载
  • 全套课件打包(第1-5章)
    ZIP · 12.8MB
    下载
  • 全套课件打包(第6-8章)
    ZIP · 15MB
    下载
  • 实战数据集:AppleStore 应用商城分析
    ZIP · 329KB
    下载
  • 实战数据集:女性服装电商分析
    ZIP · 2.8MB
    下载
  • Python 数据分析环境搭建指南
    PDF · 2MB
    下载
  • Scrapy 安装教程
    PDF · 12.7MB
    下载
  • 附加实战项目:AppleStore 应用商城数据分析
    ZIP · 0.3MB · ipynb + CSV 数据
    下载
  • 附加实战项目:银行电话营销数据分析
    ZIP · 0.4MB · ipynb + CSV 数据
    下载
  • 附加实战项目:女性服装电商评论数据分析
    ZIP · 2.7MB · ipynb + CSV 数据
    下载
  • 附加实战项目:美国化学学会杂志数据分析
    ZIP · 34.2MB · ipynb + SQLite 数据库
    下载