带有误差线的 Python matplotlib 3D 条形图

dan*_*iel 3 python matplotlib

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

在 SO 中搜索,我发现 3D 条形图可以通过绘制几个 2D 图(例如此处)来完成。这是我的代码:

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()
Run Code Online (Sandbox Code Playgroud)

我得到了 3D 'ish' 情节。

没有误差线的 3D 条形图

我的问题是:如何添加误差线?

为方便起见,让我们尝试向所有图中添加相同的误差线:

yerr=[10,10,10,10,10,10,10,10,10,10]
Run Code Online (Sandbox Code Playgroud)

如果我在每个“二维”图中添加我的误差线:

ax.bar(xs, ys, zs, zdir='y', color=cs,yerr=[10,10,10,10,10,10,10,10,10,10], alpha=0.8)
Run Code Online (Sandbox Code Playgroud)

不起作用:

AttributeError: 'LineCollection' object has no attribute 'do_3d_projection'
Run Code Online (Sandbox Code Playgroud)

我还尝试添加:

#ax.errorbar(xs, ys, zs, yerr=[10,10,10,10,10,10,10,10,10,10], ls = 'none')
Run Code Online (Sandbox Code Playgroud)

但又是一个错误:

TypeError: errorbar() got multiple values for keyword argument 'yerr'
Run Code Online (Sandbox Code Playgroud)

知道如何获得带有误差条的 3D 绘图条吗?

She*_*ore 5

据我所知,没有直接的方法可以在 3d 中做到这一点。但是,您可以创建一个变通解决方案,如下所示。解决方案的灵感来自这里。这里的技巧是通过垂直放置的两个点,然后_用作标记来充当误差线帽。

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')
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明