2017-03-17 15 views
2

matplotlibを使用して2Dカラーマップをスムーズにする方法があれば質問しますか?私のコード:matplotlibで2Dカラーマップをスムーズにする方法

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(interpolate = 'nearest')'? – 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 countoursのようなものです。あなたのデータのデータがすでにあるようですから、まだ

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

ベター:

一つの迅速な解決策は、レベルを(あなたも含めるレベルの配列を与えることができます)を指定して等高線のレベルの数を増やす:,グリッド上(例えば、各ピクセルのX、Y、Z値)には、輪郭の代わりにpcolormesh(X,Y,A)を使用してプロットする必要があります。これは、ステップではなく、完全に連続した値でプロットします。

関連する問題