2017-07-12 4 views
2

私は、いくつかのデータのカラーマップを2Dマトリックス(リスト)にプロットするプロットユーティリティを含む、いくつかのMATLABコードをPythonに移植しました。 MATLABとPythonプロットユーティリティはかなり似ているので、私は少しの労力でそれらを非常に密接に視覚的に一致させることができます。- カラーマップにある - MATLABが低く、Pythonが高いですか?

私はここで使用しているテスト行列である:テストマトリックスと検査行列

X = [1 0 3; 
    4 5 6; 
    7 8 9]; 
figure(1); 
imagesc(X); 
colormap(hot); 
colorbar; 

のPythonと

X = [ 1 0 3 ] 
    [ 4 5 6 ] 
    [ 7 8 9 ] 

MATLAB

import numpy as np 
import matplotlib as plt 

X = [ [1,0,3] , [4,5,6] , [7,8,9] ] 
fig = [] 
fig.append(plt.figure(1)) 
plt.imshow(X, cmap='hot', interpolation='nearest', aspect='auto') 
plt.colorbar() 
fig[0].show() 

私は私のデシベルテスト行列

Y = [ 0.0000 -Inf  4.7712 ] 
    [ 6.0206  6.9897  7.7815 ] 
    [ 8.4510  9.0309  9.5424 ] 

デシベルテストマトリックスとMATLAB

Y = 10*log10(X) 
figure(2); 
imagesc(Y); 
colormap(hot); 
colorbar; 
を与えるデシベル(各要素のlog10のを取り、10を掛ける)に変換するときに、この問題が来ます

パイソンdBの試験マトリックスと

Y = 10*np.log10(X) 
fig.append(plt.figure(2)) 
plt.imshow(X, cmap='hot', interpolation='nearest', aspect='auto') 
plt.colorbar() 
fig[1].show() 

トップミドル要素との契約は何ですか?これは-Infです。これは低い値とみなされます。 MATLABでは、配列に存在する最小値、この場合は0に設定されます。 -Infが0より小さいと、実際の値を使用するとスケーリングが破棄されるため、これは理にかなっています。

一方、Pythonはこの-Inf値を高い値として解釈し、配列9.5424の最高値に設定します。値が単なるInfであれば、これは私には完璧な意味があります。しかし、それは間違いなく、そうでなければならない。ここに矛盾があるのはなぜですか?他に影響を与えずに修正できますか?

EDIT:明らかに、-InfをすべてInfに置き換え、行列の最小値を求め、すべてのInfをminに置き換えることができます。しかし、私は大規模なデータセットを扱っているので、これを行い、元のデータをそのまま維持することは特に効率的ではありません。理想的には、作図ツールが無限の値をどのように解釈するかを変更する方法があります。

+0

これがそうですPythonの問題、matlabに無関係。どちらの実装も、好きなように境界ケースを実装することは自由です。 matlabタグを削除することを検討してください。私はあなたの答えはすでに答えを与えると思う、またはあなたはPythonのソースコードを変更することがあります。 – m7913d

+0

私は、サーバー上で処理され、プロットのための不必要な計算時間を追加するすべての巨大なデータセットのコピーを作成する必要がない方法を探しています。 – AlexanderJ93

+4

Pythonはそれをカラーマップの最高の色としてプロットしているのですか、それともプロットしていないだけで、背景軸の色を見せることができますか? – gnovice

答えて

4

Python ではありません。-Infはカラーマップの最高の色です。単にそれをプロットしていないだけです。あなたは'cool'のように、それに白いれていないカラーマップに切り替えることにより確認することができます。

plt.imshow(Y, cmap='cool', interpolation='nearest', aspect='auto') 
plt.show() 

enter image description here

Pythonは-Inf(だけでなく、InfNaN)を処理した画像であることをレンダリングしないことにより、パッチは、後ろから見えるように軸の色を残します。imagescを使用する場合、MATLABは、最も低いカラーマップ値に-Inf(およびNaN)を設定し、最も高いカラーマップ値にInfを設定します。 pcolorを使用している場合、MATLABはPythonのようにNaNの値をレンダリングしないで処理します。

配列の非有限の値を有限の値に置き換えてレンダリングする必要があるようです。またはmasked arrayを使用することもできます。あなただけ(黒に任意の非有限の値を設定)この特定例を修正したい場合は

、あなたはカラーマップのためset_bad方法を使用することができます。

cmap=plt.cm.hot 
cmap.set_bad('k') 
plt.imshow(Y, cmap=cmap, interpolation='nearest', aspect='auto') 
plt.show() 

enter image description here

関連する問題