【问题标题】:Formatting a 3d bar plot in matplot lib在 matplotlib 中格式化 3d 条形图
【发布时间】:2015-10-26 22:42:45
【问题描述】:

我正在使用这个代码示例

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.25, ypos+0.25)

xpos = xpos.flatten()   # Convert positions to 1D array
ypos = ypos.flatten()
zpos = np.zeros(lx*ly)

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

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

#sh()
ax.w_xaxis.set_ticklabels(column_names)
ax.w_yaxis.set_ticklabels(row_names)
ax.set_xlabel('Letter')
ax.set_ylabel('Day')
ax.set_zlabel('Occurrence')

plt.show()

我已经成功地适应了我的需求,现在我需要更改每列的颜色以使我的数据更具可读性,如另一个示例 http://matplotlib.org/examples/mplot3d/bars3d_demo.html 所示,但由于图表的构建方式完全不同,我无法想象了解如何将一个应用到另一个

【问题讨论】:

    标签: python matplotlib colors 3d axes


    【解决方案1】:

    基本上,您只需将一组颜色传递给color=。数组的每个元素都是您的条形之一。因此,根据您构建数组的方式,您可以按columnsrows 对条形图进行分组。

    例如:

    from mpl_toolkits.mplot3d import Axes3D
    import matplotlib.pyplot as plt
    import numpy as np
    %matplotlib inline
    
    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.25, ypos+0.25)
    
    xpos = xpos.flatten()   # Convert positions to 1D array
    ypos = ypos.flatten()
    zpos = np.zeros(lx*ly)
    
    dx = 0.5 * np.ones_like(zpos)
    dy = dx.copy()
    dz = data.flatten()
    
    cs = ['r', 'g', 'b', 'y', 'c'] * ly
    
    ax.bar3d(xpos,ypos,zpos, dx, dy, dz, color=cs)
    
    #sh()
    ax.w_xaxis.set_ticklabels(column_names)
    ax.w_yaxis.set_ticklabels(row_names)
    ax.set_xlabel('Letter')
    ax.set_ylabel('Day')
    ax.set_zlabel('Occurrence')
    
    plt.show()
    

    【讨论】:

    • 对不起,我真的是 python 新手,但你能告诉我如何按星期几着色吗?
    • @PeterDoro 按星期几分组,你会使用像cs = ['r', 'r', 'r', 'r', 'r', 'g', 'g', 'g', 'g', 'g', 'b', 'b', 'b', 'b', 'b', 'y', 'y', 'y', 'y', 'y', 'c', 'c', 'c', 'c', 'c', 'k', 'k', 'k', 'k', 'k', 'grey', 'grey', 'grey', 'grey', 'grey'] 这样的颜色数组,当然,这只有在你的条数始终相同时才有效。否则,您必须以编程方式构造一个具有正确形状和正确颜色重复的数组以匹配您的数据
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 2013-08-06
    • 2019-06-05
    • 2011-08-13
    • 1970-01-01
    相关资源
    最近更新 更多