python绘制3D条形图

文章目录

数据导入

尽管在matplotlib支持在一个坐标系中绘制多组条形图,效果如下

其中,蓝色表示中国,橘色表示美国,绿色表示欧盟。从这个图就可以非常直观地看出,三者自2018到2022年的GDP变化情况。但相比之下,通过增加轴坐标,可以让多组条形图分布在三维坐标中,从而更具表现力。

这里仍然以中美欧GDP为例,如下表所示,单位是万亿美元。

中国 美国 欧盟
2018 13.89 20.53 15.98
2019 14.28 21.38 15.69
2020 14.69 21.06 15.37
2021 17.82 23.32 17.19
2022 17.96 25.46 16.64

首先,把这些数值写入python

python 复制代码
import numpy as np
years = np.arange(2018, 2023)
areas = ("PRC", "EU", "USA")
GDPS = {
    'PRC': (13.89, 14.28, 14.69, 17.82, 17.96),
    'USA': (20.53, 21.38, 21.06, 23.32, 25.46),
    'EU': (15.98, 15.69, 15.37, 17.19, 16.64),
}

三维条形图

由于想在三维坐标轴中绘图,所以第一步是新建一个子坐标图,并指定projection=3d,然后在绘图时给定一个额外的y坐标,代码如下

python 复制代码
import matplotlib.pyplot as plt
import numpy as np

ax = plt.subplot(projection='3d')
colors = ['r', 'b', 'g']
yticks = [2, 1, 0]
for i,key in enumerate(areas):
    ax.bar(years, GDPS[key], 
        zs=i, zdir='y', label=key, color=colors[i], alpha=0.8)
    plt.yticks([])

plt.legend()
plt.show()

其中,设置透明度为0.8,这样可以让图像在表现时更有层次感。通过设置label,对三个地区的颜色进行了标注,效果为

bar3d

上图虽然有了3D坐标轴,但其实每个数据条仍然是二维的,通过bar3d函数,可以绘制更加结实紧固的三维方块图,其绘图参数如下

python 复制代码
bar3d(x, y, z, dx, dy, dz, color=None, zsort='average', shade=True, lightsource=None, *args, data=None, **kwargs)

其中,x,y,z是方块图的锚点坐标,dx, dy, dz是方块的长度、宽度和高度。换言之,其绘图逻辑是,先指定其绘图的起始位置,然后按照给定的长宽高绘制长方体。下面的代码就通过bar3d来绘制中美欧的GDP变化

python 复制代码
ax = plt.subplot(projection='3d')
dx = dy = np.zeros(5)+0.5
x = years
z = np.zeros_like(x)
for i,key in enumerate(areas):
    y = z + i
    dz = GDPS[key]
    ax.bar3d(x,y,z,dx,dy,dz,
        color=colors[i], alpha=0.8, label=key)

plt.yticks([0.5, 1.5, 2.5], areas)
plt.show()

这里对y轴坐标重新进行了映射,从而无需使用label也能清晰地看出每组数据所对应的地区,效果如下

bar3d函数中其他参数含义如下:

  • zsort z轴排序方案
  • shade 当为True时,会显示3D图的阴影效果
  • lightsource 3D条形图的光源
相关推荐
MoRanzhi120342 分钟前
第3篇 · 使用 PyQt5 实现 2048 桌面版游戏:MVC 架构与撤销和重做
python·mvc·pyqt5·桌面应用开发·gui开发·2048游戏·撤销与重做
蚰蜒螟1 小时前
从 Java SocketChannel 到 TCP 挥手:一次 close() 的完整调用链与引用计数解析
java·python·tcp/ip
Smoothcloud润云1 小时前
GPU算力平台跑知识库问答,模型回答总跑偏?先排查检索链路
人工智能·python·深度学习·gpu算力·gpu
mklpo1471 小时前
python3:如何按照实际执行需求导入模块,而不是启动时统一导入?(Python3.15)。2026-10-20
开发语言·人工智能·python
夜晚回家2 小时前
Python 赋值运算符详解 | 从 = 到 +=,一张记账单讲清复合赋值
开发语言·python
Maya动画技术2 小时前
pptx批量转png图片工具
python
MoRanzhi12033 小时前
第4篇 · 使用 PyQt5 实现 2048:平滑动画与性能优化
python·性能优化·qtimer·pyqt5·qpainter·gui动画·2048游戏
海姐软件测试3 小时前
Python 自动化与 AI 结合:基于 Jenkins 的回归验证实践
人工智能·python·自动化
Haoyunyi3 小时前
2026年做期货量化,和三年前已经不是一回事了
大数据·人工智能·python·金融·区块链
再__努力1点3 小时前
一个开源的AI边缘计算平台:一个项目把算能、瑞芯微、x86的NPU全打通了
人工智能·python·课程设计·媒体·流媒体