2017-05-09 83 views
3

我在matplotlib中有一个三维条形图,其中包含总共165个条形图,此时它非常混乱。根据值在matplotlib中根据值更改3D条形图中的条形颜色

enter image description here

我想根据谨慎的z值改变条的颜色:0,1,2。

我知道可以通过使用掩码(如Color matplotlib bar chart based on value)基于特定值更改一维条形图中的彩条。

而且还有如何根据值的变化吧颜色的问题:我不知道 Defining colors of Matplotlib 3D bar plot

如果我完全理解给定的答案,但我不能让它在这种情况下工作。

代码是:

data = [[0 0 0 2 0 0 1 2 0 0 0] 
      [0 0 2 2 0 0 0 0 2 0 0] 
      [1 0 2 2 1 2 0 0 2 0 2] 
      [1 0 2 2 0 2 0 2 2 2 2] 
      [2 2 2 2 2 2 2 2 2 2 2] 
      [2 2 0 2 2 2 2 2 2 2 2] 
      [0 2 2 0 2 2 2 2 2 2 2] 
      [1 2 0 0 2 1 2 2 0 0 2] 
      [0 0 2 1 0 0 2 0 0 0 0] 
      [2 1 2 2 0 0 0 2 0 0 2] 
      [2 2 2 0 2 0 0 0 2 2 2] 
      [2 2 0 0 2 2 2 2 2 0 0] 
      [2 2 1 2 0 0 0 2 2 2 0] 
      [2 0 0 2 0 0 2 2 2 2 2] 
      [2 0 0 2 0 2 2 2 2 2 2]] 

    ly = len(data[0]) 
    lx = 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() 


    ys = np.array([float(yi) for yi in y[1:]]) 

    fig = plt.figure() 
    ax = fig.add_subplot(111, projection='3d') 

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

    # try changing color bars 

    colors = ['r','g','b'] 
    for i in range(0,3): 

     ax.bar3d(xpos[i], ypos[i], zpos[i], dx, dy, dz[i], alpha=0.1, 
        color=colors[i]) 

    ax.set_xlabel('X') 
    ax.set_ylabel('Y') 
    ax.set_zlabel('Z') 


plt.show() 

回答

4

如从documentation of bar3d看出,color可以是一个数组,每一个棒颜色。

这使得在一次调用bar3d时可以很容易地将所有小节着色;我们只需要在data数组转换为一个颜色数组其可以使用颜色表来完成,

colors = plt.cm.jet(data.flatten()/float(data.max())) 

(注意,一个颜色表0和1之间取值,所以我们需要将这些值归一化到该范围)

完整的示例:

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

data = np.array([ [0, 0, 0, 2, 0, 0, 1, 2, 0, 0, 0], 
     [0, 0, 2, 2, 0, 0, 0, 0, 2, 0, 0], 
     [1, 0, 2, 2, 1, 2, 0, 0, 2, 0, 2], 
     [1, 0, 2, 2, 0, 2, 0, 2, 2, 2, 2], 
     [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], 
     [2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2], 
     [0, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2], 
     [1, 2, 0, 0, 2, 1, 2, 2, 0, 0, 2], 
     [0, 0, 2, 1, 0, 0, 2, 0, 0, 0, 0], 
     [2, 1, 2, 2, 0, 0, 0, 2, 0, 0, 2], 
     [2, 2, 2, 0, 2, 0, 0, 0, 2, 2, 2], 
     [2, 2, 0, 0, 2, 2, 2, 2, 2, 0, 0], 
     [2, 2, 1, 2, 0, 0, 0, 2, 2, 2, 0], 
     [2, 0, 0, 2, 0, 0, 2, 2, 2, 2, 2], 
     [2, 0, 0, 2, 0, 2, 2, 2, 2, 2, 2]]) 


ypos, xpos = np.indices(data.shape) 

xpos = xpos.flatten() 
ypos = ypos.flatten() 
zpos = np.zeros(xpos.shape) 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 

colors = plt.cm.jet(data.flatten()/float(data.max())) 
ax.bar3d(xpos,ypos,zpos, .5,.5,data.flatten(), color=colors) 

ax.set_xlabel('X') 
ax.set_ylabel('Y') 
ax.set_zlabel('Z') 
plt.show() 

enter image description here

+0

这是完美的,非常感谢你的解释! –