如何在条形图上制作3D效果

5 投票
2 回答
5004 浏览
提问于 2025-04-16 02:54

我有一个非常简单的柱状图,像这样:

alt text

但我想让这些柱子看起来有点3D效果,像这样:

alt text

我只想让柱子有那个3D效果……我的代码是:

fig = Figure(figsize=(4.6,4))
ax1 = fig.add_subplot(111,ylabel="Valeur",xlabel="Code",autoscale_on=True)

width = 0.35
ind = np.arange(len(values))
rects = ax1.bar(ind, values, width, color='#A1B214')
ax1.set_xticks(ind+width)
ax1.set_xticklabels( codes )
ax1.set_ybound(-1,values[0] * 1.1)
canvas = FigureCanvas(fig)
response = HttpResponse(content_type='image/png')
canvas.print_png(response)

我在matplotlib的图库里找过,试了几种方法,但都没成功,有什么好主意吗?谢谢!

2 个回答

11

我完全理解你需要3D柱状图的原因;我想这就是它们被创造出来的目的。

在Matplotlib中,制作3D图形所需的库(也叫“工具包”)并不是第三方库,而是已经包含在Matplotlib的基础安装中。 (这对于当前的稳定版本1.0是正确的,不过我记得0.98版本时并不是这样,所以这个变化——从“附加组件”变成基础安装的一部分——大概是在过去一年内发生的)

所以,下面是你需要做的:

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as PLT
import numpy as NP

fig = PLT.figure()
ax1 = fig.add_subplot(111, projection='3d')

xpos = NP.random.randint(1, 10, 10)
ypos = NP.random.randint(1, 10, 10)
num_elements = 10
zpos = NP.zeros(num_elements)
dx = NP.ones(10)
dy = NP.ones(10)
dz = NP.random.randint(1, 5, 10)

ax1.bar3d(xpos, ypos, zpos, dx, dy, dz, color='#8E4585')
PLT.show()

要在Matplotlib中创建3D柱状图,你只需要做三件(额外的)事情:

  1. 从mpl_toolkits.mplot3d中导入Axes3D

  2. 调用bar3d方法(在我的小代码中,它是通过一个名为ax1的Axes类实例来调用的)。这个方法的参数是:

    bar3d(x, y, z, dy, dz, color='b', zsort="average", *args, **kwargs)

  3. 在add_subplot中传入一个额外的参数,projection='3d'

alt text

1

据我所知,Matplotlib本身并不专门支持你刚提到的那种“3D”效果。我记得之前看到过相关的内容,但我不确定这段时间有没有变化

想了解更多细节,可以看看这个讨论串

更新

你可以看看John Porter的mplot3d模块。这个模块不是标准的Matplotlib的一部分,而是一个自定义的扩展。我自己没用过,所以对它的实用性也说不太清楚。

撰写回答