7

私は現在、3次元データの視覚化の問題に直面しています。具体的には、変化する 2 つのパラメーターがあり、3 番目の次元は結果の出力であり、この場合は 0 と 1 (パーセント) の間の値です。

説明したいいくつかの異なるデータセットがあります。matplotlib (pcolor) でヒートマップを使用するとうまくいきます。

ただし、個別のデータセットを互いに直接比較したいと考えています。データセットごとに個別のプロットを作成し、このように表現することに満足していません。それらを直接比較できるように、どういうわけかそれを1つの図にプロットしたいと思います。

3D プロット (散布図と表面図) を試してみましたが、これはかなり適切に機能していますが、値が重複しており、ほとんどの場合、1 つのデータセットしか表示されません。3D プロットは実際にはうまく機能していません。

だから私の主な質問は、誰かがこれを1つのプロットでどのように表現できるかについて考えているかどうかです.

よろしく!

4

3 に答える 3

8

それは古い質問ですが、私は最近、同じ図に2つのヒートマップをプロットすることに関連することをしました。四角形を散布図に変換し、四角形を 2 つの三角形に変換しました。

カスタム マーカーを使用して 2 つの三角形を作成しました。

 import matplotlib
 import matplotlib.pyplot as plt
 import numpy as np

 def getCustomSymbol1(path_index=1):
  if path_index==1:  #upper triangle
      verts = [
      (0.0,0.0),
      (1.0,0.0),
      (1.0,1.0),
      (0.0,0.0),]
  else:              #lower triangle
      verts = [
      (0.0,0.0),
      (0.0,1.0),
      (1.0,1.0),
      (0.0,0.0),]
  codes = [matplotlib.path.Path.MOVETO,
           matplotlib.path.Path.LINETO,
           matplotlib.path.Path.LINETO,
           matplotlib.path.Path.CLOSEPOLY,
           ] 
  pathCS1 = matplotlib.path.Path(verts, codes)
  return pathCS1, verts

 def plot_mat(matrix=np.random.rand(20,20), path_index=1, alpha=1.0, vmin=0., vmax=1.):
    nx,ny = matrix.shape
    X,Y,values = zip(*[ (i,j,matrix[i,j]) for i in range(nx) for j in range(ny) ] )
    marker,verts = getCustomSymbol1(path_index=path_index)
    ax.scatter(X,Y,s=4000, 
               marker=marker, 
               c=values, 
               cmap='viridis', 
               alpha=alpha, 
               vmin=vmin, vmax=vmax )
    return

 fig = plt.figure()
 ax = fig.add_subplot(111)
 A  = np.random.uniform(20,50,30).reshape([6,5])
 B  = np.random.uniform(40,70,30).reshape([6,5])
 vmin = np.min([A,B])
 vmax = np.max([A,B])
 plot_mat(path_index=1,vmin=vmin,vmax=vmax,matrix=A)
 plot_mat(path_index=2,vmin=vmin,vmax=vmax,matrix=B)
 plt.xlim([0,6])
 plt.ylim([0,5])
 # for the colorbar i did the trick to make first a fake mappable:
 sm = plt.cm.ScalarMappable(cmap='viridis', norm=plt.Normalize(vmin=vmin, vmax=vmax ) )
 sm._A=[]
 plt.colorbar(sm)
 plt.show()

一緒にすると、次のようなものが得られます。 ここに画像の説明を入力

于 2016-09-29T08:08:43.427 に答える
2

2 つのデータセットを一緒に表示するには、いくつかのオプションがあります。

オプション 1 - 2 つのデータセットの違いのヒートマップを描画します (または、あなたの場合により適切な比率)。

pcolor(D2-D1)

次に、これらの比較図のいくつかを提示します。

オプション 2 - 1 つのデータセットを pcolor として表示し、別のデータセットを countour として表示します。

pcolor(D1)
contour(D2)

N>2 個のデータセットを一緒に表示する必要がある場合は、contour または contourf を使用します。

contourf(D1,cmap='Blues')
contourf(D2,cmap='Reds', alpha=0.66)
contourf(D2,cmap='Reds', alpha=0.33)

3つのcontourfコマンドの出力例

また

contour(D1,cmap='Blues')
contour(D2,cmap='Reds')
contour(D2,cmap='Reds')

3 つの輪郭コマンドの出力例

残念ながら、同様のアルファ トリックは pcolor ではうまく機能しません。

于 2013-07-23T12:39:59.347 に答える
0

私が考えることができる最も良い方法は、1 つを高さ (たとえばサーフェス) としてプロットし、もう 1 つをこのサーフェスにマッピングされたヒートマップとしてプロットすることです。ここで@HYRYが提供する答えは、ランダムな色付けの例colorsです。データセットの1つを使用して配列を指定する必要があります

また、それらがどのように関連しているかについて考えることができます.一方を他方で割ると、何が起こっているかをエンコードする他のパラメーターを取得できますか、またはそれらを減算できますか?

于 2013-07-23T12:39:09.883 に答える