2017-06-02 11 views
1

私のコードの以下の最小限の例では、カラーバーを取得しようとしています。imshowの代わりにプロットに基づいてカラーバーをマッピングします

g1 = gridspec.GridSpec(1, 1) 
f, ((ax0)) = plt.subplots(1, 1) 
ax0 = subplot(g1[0]) 

cmap = matplotlib.cm.get_cmap('viridis') 

for i in linspace(0,1,11): 
    x = [-1,0,1] 
    y = [i,i,i] 
    rgba = cmap(i) 
    im = ax0.plot(x,y,color=rgba) 

f.colorbar(im) 

私もおそらくかなり明白f.colorbar(cmap)

を試してみましたが、私は、このような現実に

'ListedColormap' object has no attribute 'autoscale_None' 

などのエラーを取得し、私を定義する値は、より複雑ですが、私はこれが何をすべきだと思いますトリック。私のデータは、imshowではなくプロットでプロットされています(私はカラーマップの作成方法を知っています)。

+0

私は方法を見つけました。すぐに更新されます。 – Nigu

+0

少し遅れて、最初の質問を投稿した後、私が金曜日に見つけたのがここにあります。 'Z = [0,0]、[0,0] レベル= linspace(-1.5,5.5,11)#range命令(-1.4433333,5.5133333 + S、ステップ) CS3 = plt.contourf(Z、レベル、cmap = mymap) plt.clf()は、私がSO上で見つけた別の投稿に基づいて、scalarmappableを定義するために使用したものです。しかし、ここで提供されるソリューションはより魅力的で、問題をより直接的に解決します。ありがとう! – Nigu

答えて

3

の答えは、これまで過度に複雑に見えます。 fig.colorbar()は、最初の引数としてScalarMappableを想定しています。しばしばScalarMappableimshowまたはcontourプロットによって生成され、容易に利用可能である。あなたはカラーバーに提供するために、カスタムScalarMappableを定義する必要があります。この場合

import matplotlib.pyplot as plt 
import numpy as np 

fig, ax = plt.subplots() 

cmap = plt.cm.get_cmap('viridis') 

for i in np.linspace(0,1,11): 
    x = [-1,0,1] 
    y = [i,i,i] 
    rgba = cmap(i) 
    im = ax.plot(x,y,color=rgba) 

sm = plt.cm.ScalarMappable(cmap=cmap) 
sm.set_array([]) 
fig.colorbar(sm) 
plt.show() 

enter image description here

+0

図形をページ幅の半分で表示するにはどうすればよいですか?鉱山は不必要に大きく表示されています... –

+0

SOの投稿の中に。 –

+0

ここではmatplotlibコードを実行し、表示されるウィンドウを縮小し、スクリーンショットを作成し、スクリーンショットをIrfanViewにコピーし、関心領域を選択し、Strg + Cを押してSOのポストに貼り付けます。もう一つの選択肢は、既に 'plt.rcParams [" figure.figsize "] = 3,3'というコードから小さな図形を作成し、それを使用することです。最後のオプション: '![] [1] '構文では、SOの投稿にhtmlの「」を使用してください。 – ImportanceOfBeingErnest

1

Figurecolorbarを電話するときは、ImageまたはContourSetを渡す必要があります。 データを使用してplt.imshowを呼び出すと、データポイントのイメージを作成できます。

data = [] 
for i in np.linspace(0,1,11): 
    x = [-1,0,1] 
    y = [i,i,i] 
    rgba = cmap(i) 
    ax0.plot(x,y,color=rgba) 
    data.append([x, y]) 

image = plt.imshow(data) 

figure.colorbar(image) 

plt.show() 

参考:あなたはこれを起動することができます

1

Oluwafemi Suleのソリューションはほとんど動作しますが、それが線と同じ数字に行列をプロットします。 2番目の図を開き、ここで解決策、その2番目の図のimshow呼び出しは、最初の図でcolorbarを描画するために、結果を使用し、次にplt.show()を呼び出す前に、2番目の図を閉じん:

import matplotlib 
from matplotlib import pyplot as plt 
from matplotlib import gridspec 
import numpy as np 

cmap = matplotlib.cm.get_cmap('viridis') 

g1 = gridspec.GridSpec(1, 1) 
f0, ((ax0)) = plt.subplots(1, 1) 
f1, ((ax1)) = plt.subplots(1, 1) 

for i in np.linspace(0,1,11): 
    x = [-1,0,1] 
    y = [i,i,i] 
    rgba = cmap(i) 
    ax0.plot(x,y,color=rgba) 

data = np.linspace(0,1,100).reshape((10,10)) 
image = ax1.imshow(data) 
f0.colorbar(image) 
plt.close(f1) 

plt.show() 

結果ルックスこのように:

関連する問題