2017-03-17 99 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)而不是輪廓來繪製它。那將以完全連續的價值而不是步驟來繪製。