Python matplotlib三维条形图,带有错误条

Python matplotlib三维条形图,带有错误条,python,matplotlib,Python,Matplotlib,我正在尝试获得带有错误条的3D条形图。 我愿意使用matplotlib、seaborn或任何其他python库或工具 搜索中,我发现三维条形图可以通过绘制几个二维图来完成()。这是我的代码: import pandas as pd import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d import Axes3D dades01 = [54,43,24,104,32,63,57,14,32,12

我正在尝试获得带有错误条的3D条形图。 我愿意使用matplotlib、seaborn或任何其他python库或工具

搜索中,我发现三维条形图可以通过绘制几个二维图来完成()。这是我的代码:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D


dades01 = [54,43,24,104,32,63,57,14,32,12]
dades02 = [35,23,14,54,24,33,43,55,23,11]
dades03 = [12,65,24,32,13,54,23,32,12,43]

df_3d = pd.DataFrame([dades01, dades02, dades03]).transpose()
colors = ['r','b','g','y','b','p']


fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
z= list(df_3d)
for n, i in enumerate(df_3d):
    print 'n',n
    xs = np.arange(len(df_3d[i]))
    ys = [i for i in df_3d[i]]
    zs = z[n]

    cs = colors[n]
    print ' xs:', xs,'ys:', ys, 'zs',zs, ' cs: ',cs
    ax.bar(xs, ys, zs, zdir='y', color=cs, alpha=0.8)


ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')

plt.show()
我得到了3D“ish”图

我的问题是:如何添加错误条?

为了方便起见,让我们尝试向所有绘图添加相同的错误条:

yerr=[10,10,10,10,10,10,10,10,10,10]
如果在每个“2D”绘图中添加错误条:

ax.bar(xs, ys, zs, zdir='y', color=cs,yerr=[10,10,10,10,10,10,10,10,10,10], alpha=0.8)
不起作用:

AttributeError: 'LineCollection' object has no attribute 'do_3d_projection'
我还试图补充:

#ax.errorbar(xs, ys, zs, yerr=[10,10,10,10,10,10,10,10,10,10], ls = 'none')
但还是有一个错误:

TypeError: errorbar() got multiple values for keyword argument 'yerr'

你知道我怎样才能得到带有错误条的3D绘图条吗

首先,当2D绘图足够时,不要使用3D绘图,在这种情况下,3D绘图就足够了。对二维数据使用三维绘图会不必要地混淆事物

其次,您可以使用多索引数据帧的组合来获得所需的结果:

df = pd.DataFrame({
    'a': list(range(5))*3,
    'b': [1, 2, 3]*5,
    'c': np.random.randint(low=0, high=10, size=15)
}).set_index(['a', 'b'])

fig, ax = plt.subplots(figsize=(10,6))

y_errs = np.random.random(size=(3, 5))
df.unstack().plot.bar(ax=ax, yerr=y_errs)
这将生成如下所示的绘图:


我在这里使用的是
'bmh'
样式(也就是说,我之前在我打开的笔记本中称之为
plt.style.use('bmh')
),这就是它看起来如此的原因。

据我所知,在3d中没有直接的方法。但是,您可以创建一个变通解决方案,如下所示。该解决方案的灵感来源于。这里的技巧是通过两个垂直放置的点,然后使用
\uu
作为标记来充当错误条帽

yerr=np.array([10,10,10,10,10,10,10,10,10,10])

for n, i in enumerate(df_3d):
    xs = np.arange(len(df_3d[i]))
    ys = [i for i in df_3d[i]]
    zs = z[n]
    cs = colors[n]
    ax.bar(xs, ys, zs, zdir='y', color=cs, alpha=0.8)
    for i, j in enumerate(ys):
        ax.plot([xs[i], xs[i]], [zs, zs], [j+yerr[i], j-yerr[i]], marker="_", color=cs)

ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')

很好的解决方案!正是我想要的。也谢谢你的回答。这也很有帮助。你是对的,我不需要这个数据的3d绘图,但我只是简化了数据,使代码更容易。