当前位置: 代码网 > it编程>前端脚本>Python > 使用Python打造带类别标签的三维柱状图

使用Python打造带类别标签的三维柱状图

2025年07月11日 Python 我要评论
一、带类别标签的三维柱状图介绍带类别标签的三维柱状图是一种在三维空间中展示分类数据的可视化工具。它不仅能够通过柱子的高度直观地表示数据的大小,还能通过颜色或图例区分不同的类别。这种图表特别适合展示多组

一、带类别标签的三维柱状图介绍

带类别标签的三维柱状图是一种在三维空间中展示分类数据的可视化工具。它不仅能够通过柱子的高度直观地表示数据的大小,还能通过颜色或图例区分不同的类别。这种图表特别适合展示多组数据之间的对比关系,例如不同类别在某个变量上的表现,或者多个类别在不同条件下的差异。

特点

  • 三维空间展示:通过 x、y、z 三个坐标轴,展示数据的多维度信息。
  • 分类标注:通过颜色或图例区分不同的类别,使图表更具表现力。
  • 直观对比:柱子的高度直观地反映了数据的大小,方便进行对比分析。

应用场景

  • 数据分析:展示不同类别在某个指标上的表现,例如不同产品的销售额。
  • 科学研究:比较不同实验组在某个变量上的差异,例如不同药物的疗效。
  • 商业报告:呈现市场调研结果,例如不同地区的消费偏好。

二、数据类型准备

在绘制带类别标签的三维柱状图之前,我们需要准备以下几类数据:

  • 坐标数据:用于确定柱子在三维空间中的位置。通常包括 x、y 坐标,它们可以是连续的数值,也可以是离散的类别。
  • 高度数据:表示柱子的高度,反映了数据的大小。它是一个二维数组,每个元素对应一个柱子的高度。
  • 类别标签(可选):如果需要对柱子进行分类标注,还需要准备类别标签。这些标签可以是数字、字符串等,用于区分不同类别的柱子。

在代码中,数据要准备好:

  • xy 是坐标数据,通过 np.arangenp.meshgrid 生成了一个 10×10 的网格。
  • z_height 是高度数据,是一个 10×10 的二维数组,每个元素表示对应位置柱子的高度。
  • 类别标签没有明确给出,但从 z_height 的值可以推断出不同的高度对应不同的类别。

三、代码解释

以下是代码的详细解释,帮助你理解每一步的作用。

导入必要的库

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import axes3d
from matplotlib import rcparams
  • matplotlib.pyplot 是用于绘图的库。
  • numpy 是用于数值计算的库,方便生成和操作数据。
  • mpl_toolkits.mplot3d 提供了三维绘图的功能。
  • rcparams 用于设置全局的绘图参数,比如字体和负号显示。

设置支持中文的字体

rcparams['font.family'] = 'simhei'
rcparams['axes.unicode_minus'] = false

这两行代码的作用是让图表支持中文显示,并且正确显示负号。如果不设置,可能会出现中文乱码或负号显示不正常的情况。

数据准备

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]])
  • xy 是通过 np.arange 生成的从 1 到 10 的数组,表示 x 和 y 坐标。
  • np.meshgridxy 转换为网格形式,生成一个二维数组,方便后续绘制柱子的位置。
  • z 是一个全为零的二维数组,表示柱子的底部在 z 轴上的位置。
  • z_height 是一个二维数组,表示每个柱子的高度。

图形设置

fig = plt.figure(figsize=(10, 8), dpi=100)
ax = fig.add_subplot(111, projection='3d')
ax.view_init(elev=30, azim=135)
  • plt.figure 创建一个图形窗口,figsize 设置图形的大小,dpi 设置图形的分辨率。
  • fig.add_subplot 添加一个子图,projection='3d' 表示这是一个三维图形。
  • ax.view_init 设置三维图形的视角,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 将高度数据归一化到 [0, 1] 范围内,方便后续的颜色映射。
  • plt.cm.viridis 是一种颜色映射方案,它会根据归一化后的值生成对应的颜色。
  • cmap(norm(z_height.flatten())) 将归一化后的高度数据映射为颜色,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
    )
  • ax.bar3d 是绘制三维柱状图的函数。
  • x.flatten()[i]y.flatten()[i]z.flatten()[i] 是柱子的底部坐标。
  • 0.5, 0.5 是柱子在 x 和 y 方向上的宽度。
  • z_height.flatten()[i] 是柱子的高度。
  • color=colors[i] 设置柱子的颜色。
  • edgecolor='black' 设置柱子边缘的颜色。
  • linewidth=0.3 设置边缘的线宽。
  • shade=true 开启阴影效果,使图形更加立体。

坐标轴标签和标题

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_xlabelax.set_ylabelax.set_zlabel 分别设置 x、y 和 z 轴的标签。
  • fontsize 设置标签的字体大小。
  • labelpad 设置标签与坐标轴的距离。
  • ax.set_title 设置图形的标题。

图例

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 创建一个图例元素,marker='o' 表示用圆形标记,color='w' 表示标记的边框颜色为白色,markerfacecolor 设置标记的填充颜色,markersize 设置标记的大小。
  • label=f'类别{i+1}' 设置图例的标签。
  • colors[i % len(colors)] 根据类别数量循环使用颜色。
  • ax.legend 添加图例,handles 是图例元素列表,loc 设置图例的位置。

网格和背景

ax.grid(true)
ax.xaxis.pane.fill = false
ax.yaxis.pane.fill = false
ax.zaxis.pane.fill = false
  • ax.grid(true) 开启网格。
  • ax.xaxis.pane.fill = false 等语句将坐标轴的背景填充关闭,使图形更加简洁。

显示图形

plt.tight_layout()
plt.show()
  • plt.tight_layout():自动调整子图参数,使其填充整个图形区域,避免标签或标题被裁剪。这在图形中有多个子图或标签较长时特别有用,可以确保布局更加美观。
  • plt.show():显示最终绘制的图形。此函数会打开一个窗口,展示完整的三维柱状图,包括所有柱子、标签、图例和网格等元素。

四、运行代码

将上述代码复制到你的 python 环境中(比如 jupyter notebook 或 pycharm),运行代码后,你会看到一个三维柱状图。图中的柱子高度表示数据的大小,颜色表示不同的类别,图例会显示每个类别的颜色对应关系,事例如下图:

如果你在运行过程中遇到任何问题,比如报错或显示不正确,可以检查以下几点:

确保安装了 matplotlibnumpy 库。

检查代码中是否有拼写错误。

确保你的 python 环境支持中文显示。

完整代码如下:

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import axes3d
from matplotlib import rcparams
# 设置支持中文的字体为黑体(simhei)
rcparams['font.family'] = 'simhei'
rcparams['axes.unicode_minus'] = false  
# 数据准备
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]])
# 图形设置
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
    )
# 坐标轴标签
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)
# 图例
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')
# 网格和背景
ax.grid(true)
ax.xaxis.pane.fill = false
ax.yaxis.pane.fill = false
ax.zaxis.pane.fill = false

plt.tight_layout()
plt.show()

五、总结

通过本教程,你学会了如何使用 python 绘制带类别标签的三维柱状图。我们从数据准备开始,逐步介绍了如何设置图形、绘制柱子、添加标签和图例,并最终生成了一个酷炫的三维柱状图。这种图表非常适合展示多变量数据之间的关系,尤其是当你需要对数据进行分类标注时。

如果你对三维柱状图有更多想法或需求,比如添加动画效果、调整颜色映射等,可以继续探索 matplotlib 的强大功能。

到此这篇关于使用python打造带类别标签的三维柱状图的文章就介绍到这了,更多相关python三维柱状图内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com