2017-08-11 9 views
3

サンプルの磁化マッピングを解析しています。勾配とその方向を取得した後、それらをHSVとしてプロットしました(-πからπへの方向は色相0〜1にマッピングされ、値は正規化された勾配でした)。img_rgb = mpl.colors.hsv_to_rgb(img_hsv)でRGBに変換されました。2Dカラーバーまたはカラーホイールをmatplotlibに追加するにはどうすればよいですか?

私はVMINとVMAXを使用してHSVのカラーバーを追加するために管理が、これは、勾配の大きさを示していない。

plt.imshow(img_rgb, cmap='hsv', vmin=-180, vmax=180, extent=(0, 100, 0,100)) 
plt.xlabel('μm') 
plt.ylabel('μm') 
plt.colorbar() 

My current plot
理想的 enter image description here

、私はしたいと思います方向と大きさの両方をエンコードするカラーホイールを追加します(極座標プロットのようなものでしょうか?)。それが不可能な場合は、現在のカラーバーを拡張してX軸に勾配の大きさを含む2Dプロットを追加します。

サブプロットは明らかに可能ですが、それらはクルージュのように見えます。より良い方法がありますか?

答えて

2

最初に、2つの異なるパラメータを同時に視覚化したい場合は、2つの異なるチャネル(赤と緑など)を割り当てることで可能です。これは、2つの2次元配列を正規化して、this answerと同様に積み重ねられたimshowに供給することによって行うことができます。

あなたは正方形の2Dカラーマップとコンテンツであれば、あなたは、あなたが再びスタックとimshowに餌meshgridを作成することによって、同じように、このカラーマップを取得することができます:

from matplotlib import pyplot as plt 
import numpy as np 

##generating some data 
x,y = np.meshgrid(
    np.linspace(0,1,100), 
    np.linspace(0,1,100), 
) 
directions = (np.sin(2*np.pi*x)*np.cos(2*np.pi*y)+1)*np.pi 
magnitude = np.exp(-(x*x+y*y)) 


##normalize data: 
def normalize(M): 
    return (M-np.min(M))/(np.max(M)-np.min(M)) 

d_norm = normalize(directions) 
m_norm = normalize(magnitude) 

fig,(plot_ax, bar_ax) = plt.subplots(nrows=1,ncols=2,figsize=(8,4)) 

plot_ax.imshow(
    np.dstack((d_norm,m_norm, np.zeros_like(directions))), 
    aspect = 'auto', 
    extent = (0,100,0,100), 
) 

bar_ax.imshow(
    np.dstack((x, y, np.zeros_like(x))), 
    extent = (
     np.min(directions),np.max(directions), 
     np.min(magnitude),np.max(magnitude), 
    ), 
    aspect = 'auto', 
    origin = 'lower', 
) 
bar_ax.set_xlabel('direction') 
bar_ax.set_ylabel('magnitude') 

plt.show() 

結果を同じことがまた、極性Axesでなんとかする必要があります原則として

square-shaped 2d colorbar

が、this github ticketにコメントによると、0:次のようになりますは極軸をサポートしていないため、imshowをディスク全体に書き込むことができませんでした。

EDIT

ImportanceOfBeingErnestのおかげで、別の質問へのhis answercolorキーワードはそれをしなかった)、今ここpcolormeshを使用して極軸上の2Dカラーマップ。

working round 2d colormap

:これは、この図を生成

fig= plt.figure(figsize=(8,4)) 
plot_ax = fig.add_subplot(121) 
bar_ax = fig.add_subplot(122, projection = 'polar') 

plot_ax.imshow(
    np.dstack((d_norm,m_norm, np.zeros_like(directions))), 
    aspect = 'auto', 
    extent = (0,100,0,100), 
) 

theta, R = np.meshgrid(
    np.linspace(0,2*np.pi,100), 
    np.linspace(0,1,100), 
) 

t,r = np.meshgrid(
    np.linspace(0,1,99), 
    np.linspace(0,1,100), 
)  

image = np.dstack((t, r, np.zeros_like(r))) 

color = image.reshape((image.shape[0]*image.shape[1],image.shape[2])) 

bar_ax.pcolormesh(
    theta,R, 
    np.zeros_like(R), 
    color = color, 
) 

bar_ax.set_xticks(np.linspace(0,2*np.pi,5)[:-1]) 
bar_ax.set_xticklabels(
    ['{:.2}'.format(i) for i in np.linspace(np.min(directions),np.max(directions),5)[:-1]] 
) 
bar_ax.set_yticks(np.linspace(0,1,5)) 
bar_ax.set_yticklabels(
    ['{:.2}'.format(i) for i in np.linspace(np.min(magnitude),np.max(magnitude),5)] 
) 
bar_ax.grid('off') 

plt.show() 

:最も注目すべきいくつかの注意点がありました、colorsの寸法は、それ以外のカラーマップは、螺旋状を持って、meshgridtheta内方向よりも1小さくする必要があります

+0

最初の部分と同様の回答[ここ](https://stackoverflow.com/a/41967868/4124317)。極軸に関しては、 '' pcolormesh''はうまくいくはずです。 – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest申し訳ありませんが、私はその答えに気付かず、重複としてマークしています。私は 'pcolormesh'を試みましたが、マトリックスの大きさについて苦情を言いました(2Dのみが許可されています)。私が持っていた別のアイデアは 'alpha = 0.5'を使うことでしたが、それはあまり良く見えませんでした。 –

+0

他の答えは極プロットについて尋ねなかった。だから私たちはこれを開いたままにすることができます。pcolormeshの問題は[この回答](https://stackoverflow.com/a/45264011/4124317)の最後の部分のように配列をnone '.set_array(None) 'に設定することで解決できますか? – ImportanceOfBeingErnest

関連する問題