带有matplotlib的3D条形图 - 重叠和图例问题

时间:2017-07-22 13:23:56

标签: python matplotlib plot bar-chart

我有一段代码用三维绘制数据框,每一列都被添加到循环内的图中。代码的灵感来自这篇文章(How to order dataframe for plotting 3d bar in pandas),但由于它已经很老了,我想在另一篇文章中写一下。

df = pd.DataFrame(index = index, data = np.random.randint(0,100,size=(366, 6)), columns=list('ABCDEF'))

ind = 0
colors = ['darkred','darkgreen','dodgerblue','gold','royalblue','purple']
for i in reversed(range(0, len(df.columns),1)):
    col_name = df.columns[i]
    xpos= np.arange(df.shape[0])
    ypos= (df.shape[1]-1) - ind
    xpos, ypos = np.meshgrid(xpos+0.25, ypos+0.25)
    xpos = xpos.flatten()
    ypos = ypos.flatten()
    zpos=np.zeros(df.shape[0]).flatten()

    dx=0.5 * np.ones_like(zpos)
    dy=0.1 * np.ones_like(zpos)
    dz=df[str(col_name)].values.ravel()

    ax.bar3d(xpos,ypos,zpos,dx,dy,dz, color=colors[i], alpha=0.1, 
              label=str(col_name))
    ind += 1


ax.set_yticks([.5,1.5,2.5,3.5,4.5,5.5])
ax.w_yaxis.set_ticklabels(df.columns)
ax.set_xlabel('Day of Year')
ax.set_ylabel('Device')
ax.set_zlabel('Production')
plt.show()

我这里有两个问题。首先,重叠的问题(见下图)。具有总体大值的列在背景中绘制,并且随着平均值减小,它们被绘制到前景。但是,即使我试图“破解”它并从最后一列到第一列(参见代码片段),它仍然会覆盖在它前面的蓝色图上的紫色图,或者覆盖在它上面的黄色图。其他蓝色的......任何想法如何解决?

第二个问题与传奇有关。这些图有标签,但如果我尝试基本的ax.legend()命令,则会出现以下错误:

  

AttributeError:'Poly3DCollection'对象没有属性'_edgecolors2d'

我还尝试为每个绘图创建Rectangle代理,在循环内部并将它们与列的名称相关联,但它也不起作用。有什么想法吗?

Overlapping: purple over dark blue and yellow over medium blue data

0 个答案:

没有答案