Python中matplotlib中3d直方图的奇怪行为

Python中matplotlib中3d直方图的奇怪行为,python,numpy,matplotlib,scipy,data-visualization,Python,Numpy,Matplotlib,Scipy,Data Visualization,我在scipy/numpy中有一个Nx3矩阵,我想用它制作一个三维条形图,其中X轴和Y轴由矩阵的第一列和第二列的值决定,每个条的高度是矩阵中的第三列,条的数量由N决定 此外,我想绘制这些矩阵的几组,每一组都有不同的颜色(“分组”3D条形图) 当我试着把它画成如下图: ax.bar(data[:, 0], data[:, 1], zs=data[:, 2], zdir='z', alpha=0.8, color=curr_color) 我得到了非常奇怪的酒吧——如图

我在scipy/numpy中有一个Nx3矩阵,我想用它制作一个三维条形图,其中X轴和Y轴由矩阵的第一列和第二列的值决定,每个条的高度是矩阵中的第三列,条的数量由N决定

此外,我想绘制这些矩阵的几组,每一组都有不同的颜色(“分组”3D条形图)

当我试着把它画成如下图:

ax.bar(data[:, 0], data[:, 1], zs=data[:, 2],
               zdir='z', alpha=0.8, color=curr_color)
我得到了非常奇怪的酒吧——如图所示:


你知道为什么酒吧会这么弯曲,形状怪异吗?我只希望在X-Y点上有一个条,其高度等于Z点。

您没有正确使用关键字参数
zs
。它是指放置每组钢筋的平面(沿轴定义)。它们是弯曲的,因为它假设由
ax.bar
调用定义的一组条在同一平面上。您最好多次调用
ax.bar
(每个平面一次)。紧跟其后。您希望
zdir
'x'
'y'

编辑

下面是完整的代码(主要基于上面链接的示例)


查看文档,考虑使用<代码> BAR3D 方法:你的意思是对每个平面调用一次?你能举个例子吗?我还是没法把它修好谢谢你。如何在3D空间中的每个轴上设置标签?感谢您的代码,您没有将ys传递给“bar”——这是故意的吗?它被传递为
(我认为这个名称会澄清平面的概念——我可能应该将其命名为
平面
)。每个层/平面的所有y都相同。我使用
ys[0]
选择第一个值。如果希望它们都在同一平面上,则只需传递一个y值<在我看来,code>zs和
zdir
不幸地被命名,因为它们通常(在本例中)沿着z以外的另一个轴。我得到的错误是“3d”投影无效。另外,你知道如何更改标签吗?
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# this is just some setup to get the data
r = numpy.arange(5)
x1,y1 = numpy.meshgrid(r,r)
z1 = numpy.random.random(x1.shape)

# this is what your data probably looks like (1D arrays):
x,y,z = (a.flatten() for a in (x1,y1,z1))
# preferrably you would have it in the 2D array format
# but if the 1D is what you must work with:
# x is: array([0, 1, 2, 3, 4, 0, 1, 2, 3, 4,
#              0, 1, 2, 3, 4, 0, 1, 2, 3, 4,
#              0, 1, 2, 3, 4])
# y is: array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
#              2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
#              4, 4, 4, 4, 4])

for i in range(0,25,5):
    # iterate over layers
    # (groups of same y)
    xs = x[i:i+5] # slice each layer
    ys = y[i:i+5]
    zs = z[i:i+5]
    layer = ys[0] # since in this case they are all equal.
    cs = numpy.random.random(3) # let's pick a random color for each layer
    ax.bar(xs, zs, zs=layer, zdir='y', color=cs, alpha=0.8)

plt.show()