【问题标题】:Matplotlib - Wrong normals on 3D bars plotMatplotlib - 3D 条形图上的法线错误
【发布时间】:2013-05-01 05:24:20
【问题描述】:

问题


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


示例


当我绘制一个包含 240 个条形的高密度箱图时,我得到以下结果:

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


关于


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


日志


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

RuntimeWarning:在除法中遇到无效值 对于法线中的n])


非常感谢任何帮助。


编辑

有了@Saullo Castro 的回答,这是生成的新图表:

或者,使用答案中提供的示例(请参阅标有红点的区域):

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

【问题讨论】:

    标签: python numpy charts matplotlib


    【解决方案1】:

    当你调用ax.bar3d()时使用参数zsort='max'可以解决你的问题(见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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      • 1970-01-01
      • 1970-01-01
      • 2016-11-15
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多