2017-03-17 97 views
2

我的问题是,如果有任何方式使用matplotlib来平滑二维彩色地图?我的代码:如何平滑二维彩色地图在matplotlib

def map(): 
    # setup parameters 
    j = 0 
    N = 719 
    N2 = 35 
    x = np.linspace(190, 800, N) 
    y = np.linspace(10, 360, N2) # (1,2,3), 1 - start Temp, 2- end temp + 10K, 3 - how many steps to reach it 
    z = [] 
    A = np.zeros([35,719]) # [1 2], 1 - number of spectras, 2 - delta wavelength 
    # run 
    for i in range(10,360,10): 
      Z = [] 
      file_no = (str(0) + str(i))[-3:] 
      data = np.genfromtxt('C:\\Users\\micha_000\\Desktop\\Measure\\' + '160317_LaPONd_g500_%s_radio.txt'%file_no,skip_header = 12) 
      for line in data: 
       Z.append(line[1]-6000) 
      A[j,:] = Z 
      j = j+1 
    X, Y = np.meshgrid(x,y) 
    fig, ax = plt.subplots() 
    cs = ax.contourf(X, Y, A, cmap=cm.viridis) 
    norm = colors.Normalize(vmin = 0, vmax = 1) 
    plt.xlabel('wavelength [nm]') 
    plt.ylabel('temperature [K]') 
    plt.title('LaPONd_g500') 
    cbar = fig.colorbar(cs, norm = norm) 
    plt.savefig('C:\\Users\\micha_000\\Desktop\\Measure\\LaPONd_g500_radio_map.png') 
    plt.show() 
    plt.close() 

这里是什么,我收到一个例子: enter image description here

有没有什么办法让它通过平滑过渡像素更好看?

+0

我知道'imshow'有含蓄'interpolate'的说法,你可以这样做:'plt.show(插值= '最近')'? – Dair

回答

0

打开PNG作为一个数组,并用平均值滤波器模糊它。搜索卷积过滤器以了解更多信息。我只是用一个25像素的正方形平均滤波器,但你可以使用高斯分布,使它看起来更顺畅..

import numpy as np 
from scipy import ndimage, signal, misc 

img = ndimage.imread('C:/.../Zrj50.png') 

#I used msPaint to get coords... there's probably a better way 
x0, y0, x1, y1 = 87,215,764,1270 #chart area (pixel coords) 

#you could use a gaussian filter to get a rounder blur pattern 
kernel = np.ones((5,5),)/25 #mean value convolution 

#convolve roi with averaging filter 
#red 
img[x0:x1, y0:y1, 0] = signal.convolve2d(img[x0:x1, y0:y1, 0], kernel, mode='same', boundary='symm') 
#green 
img[x0:x1, y0:y1, 1] = signal.convolve2d(img[x0:x1, y0:y1, 1], kernel, mode='same', boundary='symm') 
#blue 
img[x0:x1, y0:y1, 2] = signal.convolve2d(img[x0:x1, y0:y1, 2], kernel, mode='same', boundary='symm') 

#do it again for ledgend area 
#... 

misc.imsave('C:/.../Zrj50_blurred.png', img) 

使用高斯反而是很容易的:

#red 
img[x0:x1, y0:y1, 0] = ndimage.gaussian_filter(img[x0:x1, y0:y1, 0], 4, mode='nearest') 
+1

非常感谢你:) – Maq92

+0

@ Maq92如果你要与图像在未来做更多,我强烈鼓励卷积过滤器阅读起来。他们几乎是所有图像处理完成 – Aaron

+0

这使数据平滑,而不是情节。所以我不认为这是对这个问题的回答。 – ImportanceOfBeingErnest

3

问题不是调色板(这是在所有matplotlib光滑),但实际上所使用contourf(),其产生的有限集合countours,每个具有单一颜色,因此是不光滑的。默认值是10个数字。

一个快速的解决方案:,通过指定水平的提高线级别的数量(也可以给出一个数组,其中层面包括):

cs = ax.contourf(X, Y, A, cmap=cm.viridis, levels=100) 

更妙的是,因为它似乎你的数据数据已经在网格上(例如每个像素的X,Y,Z值),您应该使用pcolormesh(X,Y,A)而不是轮廓来绘制它。那将以完全连续的价值而不是步骤来绘制。