Matplotlib 3D 条形图

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()

运行之后,效果如下图所示。

Matplotlib 基本 3D 条形图

分析:

在这个例子中,我们定义了四个条形的位置 (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()

运行之后,效果如下图所示。

Matplotlib 自定义 3D 条形图的颜色

分析:

这里我们创建了一个包含 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()

运行之后,效果如下图所示。

Matplotlib在不同的 z 高度绘制 3D 条形图

分析:

在这个例子中,我们修改了 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()

运行之后,效果如下图所示。

Matplotlib 3D 条形图的实际应用

分析:

在这个例子中,我们用 3D 条形图展示了三个城市在两年内的销售额。其中,X 轴表示城市,Y 轴表示年份,Z 轴则表示销售额。

通过使用 for 循环 结合 enumerate() 函数来循环遍历数据,我们为每个城市和年份组合创建了一个条形。这种方式可以使得不同城市和年份的销售额对比更加直观。例如,一眼就能看出北京在 2024 年的销售额最高。

同时,我们还使用了 set_xticks() 和 set_yticks() 函数设置了自定义的标签,从而使得图表更易于理解。

上一篇: Matplotlib 子图

下一篇: Matplotlib 3D 散点图

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号