Matplotlib 3D 条形图函数
有些时候,我们的数据不仅仅只有两个维度(x、y),而是涉及到三个维度。比如:
- 不同地区(x 轴)。
- 不同年份(y 轴)。
- 销售额(z 轴)。
像这样的数据,使用普通的二维柱状图就没法直观展示出来了,此时应该使用 3D 条形图。在 Matplotlib 中,我们可以使用 bar3d() 函数来绘制 3D 条形图。
语法:
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
ax.bar3d(
x,
y,
z,
dx,
dy,
dz,
color='red',
shade=True,
**kwargs
)说明:
如果想要使用 3D 条形图,我们首先需要从 mpl_toolkits.mplot3d 中导入 Axes3D 类,然后使用 add_subplot() 函数创建一个 3D 的子图,最后再调用 bar3d() 函数来创建 3D 条形图。
其中,bar3d() 函数接收以下参数。
x(必选):是一维数组或列表,表示每个条形在 x 轴上的起始位置。y(必选):是一维数组或列表,表示每个条形在 y 轴上的起始位置。z(必选):是一维数组或列表,表示每个条形在 z 轴上的起始位置(通常设置为 0 以在 xy 平面上开始)。dx(必选):是一维数组或列表,表示每个条形在 x 轴上的宽度。dy(必选):是一维数组或列表,表示每个条形在 y 轴上的深度。dz(必选):是一维数组或列表,表示每个条形在 z 轴上的高度(即数值大小)。color(可选):指定条形的颜色。可以是一个单一的颜色值,也可以是一个与条形数量相同的颜色列表。shade(可选):是一个布尔值,用于控制是否为条形添加阴影效果,以增强 3D 感。默认为 True。**kwargs:其他传递给 bar3d 函数的关键字参数,例如 alpha(透明度)、edgecolor(边框颜色)等。
提示: 如果想要了解如何绘制二维柱状图,另请参阅:Matplotlib 柱状图。
Matplotlib 3D 条形图示例
接下来,我们通过几个简单例子来介绍一下 Matplotlib 是如何绘制 3D 条形图的。
示例 1:绘制简单的 3D 条形图
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
# 条形的位置和尺寸
x = [1, 2, 3, 4]
y = [1, 1, 1, 1]
z = [0, 0, 0, 0]
dx = [0.5, 0.5, 0.5, 0.5]
dy = [0.5, 0.5, 0.5, 0.5]
dz = [2, 4, 1, 5]
# 绘制 3D 条形图
ax.bar3d(x, y, z, dx, dy, dz)
# 设置标题和标签
ax.set_title('3D 条形图')
ax.set_xlabel('X 轴')
ax.set_ylabel('Y 轴')
ax.set_zlabel('Z 轴')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
在这个例子中,我们定义了四个条形的位置 (x, y, z) 和尺寸 (dx, dy, dz),并且所有条形都从 z=0 平面开始。然后使用 ax.bar3d() 函数将这些数据绘制成了 3D 条形图。
示例 2:自定义条形的颜色
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
# 条形的位置和尺寸
x = [1, 2, 3, 4]
y = [1, 1, 1, 1]
z = [0, 0, 0, 0]
dx = [0.5, 0.5, 0.5, 0.5]
dy = [0.5, 0.5, 0.5, 0.5]
dz = [2, 4, 1, 5]
# 自定义颜色列表
colors = ['red', 'green', 'blue', 'yellow']
# 绘制 3D 条形图,并设置颜色
ax.bar3d(x, y, z, dx, dy, dz, color=colors)
# 设置标题和标签
ax.set_title('3D 条形图')
ax.set_xlabel('X 轴')
ax.set_ylabel('Y 轴')
ax.set_zlabel('Z 轴')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
这里我们创建了一个包含 4 种颜色的列表 colors,并将其传递给 bar3d() 函数的 color 参数。这样,每个条形都会被赋予列表中的对应颜色。
示例 3:在不同的 z 高度绘制条形
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
# 条形的位置和尺寸
x = [1, 2, 3, 4]
y = [1, 1, 1, 1]
z = [0, 1, 2, 0.5] # 不同的起始 z 值
dx = [0.5, 0.5, 0.5, 0.5]
dy = [0.5, 0.5, 0.5, 0.5]
dz = [2, 3, 1.5, 4]
# 绘制 3D 条形图
ax.bar3d(x, y, z, dx, dy, dz, color='skyblue', shade=True)
# 设置标题和标签
ax.set_title('3D 条形图')
ax.set_xlabel('X 轴')
ax.set_ylabel('Y 轴')
ax.set_zlabel('Z 轴')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
在这个例子中,我们修改了 z 列表的值,使得每个条形从不同的 z 高度开始绘制。这种方式可以用于展示更复杂的三维数据结构。
Matplotlib 3D 条形图案例
假设我们有三个城市 2023 年和 2024 年的销售额,此时可以考虑用 3D 条形图来展示。
示例 4:3D 条形图的实际应用
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
# 数据
cities = ['北京', '上海', '广州']
years = [2023, 2024]
x = []
y = []
z = []
dx = []
dy = []
dz = []
data = {
'北京': [100, 150],
'上海': [120, 130],
'广州': [90, 110]
}
for i, city in enumerate(cities):
for j, year in enumerate(years):
x.append(i)
y.append(j)
z.append(0)
dx.append(0.4)
dy.append(0.4)
dz.append(data[city][j])
# 绘图
ax.bar3d(x, y, z, dx, dy, dz, color='lightskyblue', shade=True)
ax.set_xticks(range(len(cities)))
ax.set_xticklabels(cities)
ax.set_yticks(range(len(years)))
ax.set_yticklabels(years)
ax.set_xlabel('城市')
ax.set_ylabel('年份')
ax.set_zlabel('销售额')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
在这个例子中,我们用 3D 条形图展示了三个城市在两年内的销售额。其中,X 轴表示城市,Y 轴表示年份,Z 轴则表示销售额。
通过使用 for 循环 结合 enumerate() 函数来循环遍历数据,我们为每个城市和年份组合创建了一个条形。这种方式可以使得不同城市和年份的销售额对比更加直观。例如,一眼就能看出北京在 2024 年的销售额最高。
同时,我们还使用了 set_xticks() 和 set_yticks() 函数设置了自定义的标签,从而使得图表更易于理解。
