9

5列といくつかの行を持つ2次元配列があります。異なる列には次のエントリがあり、x1 y1 x2 y2 z (x1,y1) から (x2,y2) への矢印をプロットしたいのですが、矢印の色は組み込みのカラーマップに対応する z 列から取得する必要があります。このmatplotlib/pythonをどうやって行うことができますか?

4

1 に答える 1

15

あなたはこれを行うことができます:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as colors
import matplotlib.cm as cmx

DATA = np.random.rand(5,5)

cmap = plt.cm.jet

cNorm  = colors.Normalize(vmin=np.min(DATA[:,4]), vmax=np.max(DATA[:,4]))

scalarMap = cmx.ScalarMappable(norm=cNorm,cmap=cmap)

for idx in range(0,len(DATA[:,1])):
    colorVal = scalarMap.to_rgba(DATA[idx,4])
    plt.arrow(DATA[idx,0],  #x1
              DATA[idx,1],  # y1
              DATA[idx,2]-DATA[idx,0], # x2 - x1
              DATA[idx,3]-DATA[idx,1], # y2 - y1
              color=colorVal)

plt.show()  

コマンドのオプションに渡す引数に値を変換するために使用scalarMap.to_rgbaします。 結果は次のようになります。 zcolorarrow

ここに画像の説明を入力

EDIT
カラーバーも見たい場合は、もう少し注意が必要です。更新された最小限の例を次に示します。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as colors
import matplotlib.cm as cmx
import matplotlib as mpl

DATA = np.random.rand(5,5)

cmap = plt.cm.jet

cNorm  = colors.Normalize(vmin=np.min(DATA[:,4]), vmax=np.max(DATA[:,4]))

scalarMap = cmx.ScalarMappable(norm=cNorm,cmap=cmap)

fig = plt.figure()
ax  = fig.add_axes([0.1, 0.1, 0.7, 0.85]) # [left, bottom, width, height]
axc = fig.add_axes([0.85, 0.10, 0.05, 0.85])

for idx in range(0,len(DATA[:,1])):
    colorVal = scalarMap.to_rgba(DATA[idx,4])
    ax.arrow(DATA[idx,0],  # x1
             DATA[idx,1],  # y1
             DATA[idx,2]-DATA[idx,0], # x2 - x1
             DATA[idx,3]-DATA[idx,1], # y2 - y1
             color=colorVal)

cb1 = mpl.colorbar.ColorbarBase(axc, cmap=cmap,
                                norm=cNorm,orientation='vertical')

plt.show() 

注意事項:

  • import matplotlib as mplへのアクセス権を持つための追加ColorbarBase
  • ここで、矢印用とカラーバー用の2 つの軸を明示的に指定する必要があります。この 2 番目の軸のセットは、カラー バーに対して妥当なサイズである必要があります。
    このadd_axesコマンドは[left, botton, width, height]、相対単位を入力として受け取ります。したがって、右辺は で与えられleft + widthます。
  • 軸の最初のセット 、最初の図に矢印をプロットしaxます。
  • 軸の 2 番目のセット にコロバーをプロットしaxcます。cmap、正規化、cNormおよび向きを引数として 渡します。

図は次のようになります。

ここに画像の説明を入力

編集2

矢印に別の色のエッジが必要な場合は、(または) に変更colorして( ) を指定します。さらに、矢印の幅 ( default = ) とヘッドの幅( default = )を制御したい場合があります。facecolorfcedgecolorec0.0013x width

plt.arrow(DATA[idx,0],  #x1
          DATA[idx,1],  # y1
          DATA[idx,2]-DATA[idx,0], # x2 - x1
          DATA[idx,3]-DATA[idx,1], # y2 - y1
          facecolor=colorVal,
          edgecolor='k',
          width=0.005,
          head_width=0.01)
于 2013-09-11T18:46:18.827 に答える