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

 更新时间:2025年07月11日 09:08:38   作者:Code_Verse  
带类别标签的三维柱状图是一种在三维空间中展示分类数据的可视化工具,下面小编就来和大家详细介绍一下如何使用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三维柱状图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python学习之基于Python的人脸识别技术学习

    python学习之基于Python的人脸识别技术学习

    面部识别技术的应用越来越广泛,它广泛应用于安全系统、人机交互、社交媒体、医疗保健等领域。本文介绍了基于Python的人脸识别技术,感兴趣的小伙伴可以参考阅读
    2023-03-03
  • 基于Python自动化实现Word文档专业排版

    基于Python自动化实现Word文档专业排版

    在办公自动化领域,用 Python 处理 Word 文档已经是非常成熟和高效的方案了,本文将和大家使用Python实现自动化Word文档排版的相关知识,希望对大家有所帮助
    2026-05-05
  • 如何利用PyQt5美化你的GUI界面

    如何利用PyQt5美化你的GUI界面

    python的脚本开发简单,有时候只需几行代码就能实现丰富的功能,而且python本身是跨平台的,所以深受程序员的喜爱,下面这篇文章主要给大家介绍了关于如何利用PyQt5美化你的GUI界面的相关资料,需要的朋友可以参考下
    2022-01-01
  • Python多线程获取返回值代码实例

    Python多线程获取返回值代码实例

    这篇文章主要介绍了Python多线程获取返回值代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • 基于python cut和qcut的用法及区别详解

    基于python cut和qcut的用法及区别详解

    今天小编就为大家分享一篇基于python cut和qcut的用法及区别详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • Python count()函数用法详解

    Python count()函数用法详解

    这篇文章主要给大家介绍了关于Python count()函数用法的相关资料,Python count()方法用于统计字符串里某个字符出现的次数,可选参数为在字符串搜索的开始与结束位置,需要的朋友可以参考下
    2024-02-02
  • Python通过DOM和SAX方式解析XML的应用实例分享

    Python通过DOM和SAX方式解析XML的应用实例分享

    这篇文章主要介绍了Python通过DOM和SAX方式解析XML的应用实例分享,针对这两种解析方式Python都有相关的模块可供使用,需要的朋友可以参考下
    2015-11-11
  • python GUI框架pyqt5 对图片进行流式布局的方法(瀑布流flowlayout)

    python GUI框架pyqt5 对图片进行流式布局的方法(瀑布流flowlayout)

    这篇文章主要介绍了python GUI框架pyqt5 对图片进行流式布局的方法(瀑布流flowlayout),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • Python使用修饰器执行函数的参数检查功能示例

    Python使用修饰器执行函数的参数检查功能示例

    这篇文章主要介绍了Python使用修饰器执行函数的参数检查功能,结合具体实例形式分析了Python实现修饰器针对函数参数检查的原理、步骤与相关操作技巧,需要的朋友可以参考下
    2017-09-09
  • PyQt5简单读取以及显示图片的应用实例

    PyQt5简单读取以及显示图片的应用实例

    我们在进行图像处理时,经常会用到读取图片并显示出来这样的操作,下面这篇文章主要给大家介绍了关于PyQt5简单读取以及显示图片应用的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05

最新评论