Matplotlib:具有imshow的特定颜色

时间:2013-01-15 13:16:39

标签: python matplotlib

我有一些3D数据,例如d=[x, y, z, f] 其中z是Z中的一列数字,用作颜色信息。

f是一个

的标志
    如果xy有一些特定值(丑陋^^),则
  1. 0
  2. 如果xy正常,则
  3. 1
  4. 因此,对于良好的数据d[ d[:,3] == 1 ],我想生成个人资料

    plt.imshow(resampled.T, extent=extent, vmin=MIN, vmax=MAX, origin='lower')
    

    对于丑陋的数据d[ d[:,3] == 0 ]我只想使用特定的颜色,例如的

    有没有办法实现这一点?

    编辑:结合@eumiro和@Rutger Kassies的评论,我现在得到以下结果 enter image description here

    我认为这令人满意。 为了完整起见(或者可能有一些优化我不知道^^),这里是代码和data

    import numpy as np
    from matplotlib.mlab import griddata
    import matplotlib
    import matplotlib.pyplot as plt
    
    
    def plotprofile(x, y, z0, name='dummy', save=1):
        #plt.figure()
        N = 50j
        z = z0[:,0]
        extent = (min(x), max(x), min(y), max(y))
        xs,ys = np.mgrid[extent[0]:extent[1]:N, extent[2]:extent[3]:N]
        resampled = griddata(x, y, z, xs, ys)
    
        cmap = plt.get_cmap()
        cmap.set_bad(color = 'k', alpha = 1.)
        #plt.imshow(resampled.T, cmap='Greys', extent=extent, origin='lower', interpolation='spline36')
        plt.imshow(resampled.T,  cmap=cmap, extent=extent, origin='lower',  vmin=min(z),  vmax=-min(z),interpolation='spline36')
    
    cbar=plt.colorbar()
    s=20
    plt.ylabel(r"$y$", size=s)
    plt.xlabel(r"$x", size=s)
    plt.xlim([x.min(),x.max()])
    plt.ylim([y.min(),y.max()])
    
    if save:
        for end in ["pdf", "png", "eps"]:
            print "save %s.%s"%(name,end)
            plt.savefig("%s.%s"%(name,end))
    else:
        plt.show()
    plt.clf()
    
    
    if __name__ == '__main__':
        filename = 'data.txt'
        data = np.loadtxt(filename)
        x = data[:,0]
        y = data[:,1]
        z = data[:,3:]
        plotprofile(x, y, z,  'dummy', 0)
    

1 个答案:

答案 0 :(得分:0)

使用f屏蔽z?

,难道不能在z中创建普通的colourmap
dd = d[:, :3]
dd[:,2] = dd[:,2] * d[:,3]

然后转换为这样的图像:

M = dd.max(0)
m = dd.min(0)

x = np.arange(m[0], M[0] + 1)
y = np.arange(m[1], M[1] + 1)
[X, Y] = np.meshgrid(x, y)

Z = np.zeros_like(X)

for num in range(0,size(dd, 0)):
    Z[dd[num, 0], dd[num, 1]] = dd[num, 2]

现在,您应该能够将Z绘制成正常图像或作为[X, Y]的表面