Matplotlib - 3D条形图上的法线错误

时间:2013-05-01 05:24:21

标签: python numpy charts matplotlib

问题


当使用matplotlib并在图表上绘制3d条形图时,我在某些条形图面上得到了错误的法线值。


示例


当我绘制240个条形图的高密度箱图时,我得到了这个结果: enter image description here

看到一些酒吧的某些面孔是错的?条形Z顺序也出错了。


关于


我正在使用Matplotlib和Numpy的最新稳定版本。我的Python版本是2.7.3


日志


这是我从控制台获得的唯一警告:

  

RuntimeWarning:在divide中遇到无效值     对于正常情况下的n])


非常感谢任何帮助。


修改

随着@Saullo Castro的回答,这是生成的新图表: enter image description here

或者,使用答案中提供的样本(参见标有红点的区域):

enter image description here

唯一的问题是顶部的酒吧面,但已经相当不错了。如果有人对此有任何意见,请随时帮助我。

1 个答案:

答案 0 :(得分:5)

在致电zsort='max'时使用参数ax.bar3d()解决了您的问题(请参阅here):

ax.bar3d(xpos,ypos,zpos, dx, dy, dz,  color='b', alpha=1., zsort='max')

我使用this other question代码的修改版本来解决您的问题:

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

data = np.array([[0,1,0,2,0],
                 [0,3,0,2,0],
                 [6,1,1,7,0],
                 [0,5,0,2,9],
                 [0,1,0,4,0],
                 [9,1,3,4,2],
                 [0,0,2,1,3], ])

column_names = ['a','b','c','d','e']
row_names = ['Mon','Tue','Wed','Thu','Fri','Sat','Sun']

fig = plt.figure()
ax = Axes3D(fig)

lx= len(data[0])            # Work out matrix dimensions
ly= len(data[:,0])
xpos = np.arange(0,lx,1)    # Set up a mesh of positions
ypos = np.arange(0,ly,1)
xpos, ypos = np.meshgrid(xpos+0.5, ypos+0.5)

xpos = xpos.flatten()   # Convert positions to 1D array
ypos = ypos.flatten()
zpos = np.ones(lx*ly)*1e-10

dx = 1. * np.ones_like(zpos)
dy = dx.copy()
dz = data.flatten()

ax.bar3d(xpos,ypos,zpos, dx, dy, dz,  color='b', alpha=1., zsort='max')
plt.ion()
plt.show()