2017-06-02 73 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' 

在現實中,價值定義我是比較複雜的,但我認爲這應該這樣做招。我的數據是用plot繪製的,而不是imshow(我知道如何製作色彩地圖)。

+0

我找到了一種方法。將盡快更新。 – Nigu

+0

有點遲疑,這是我在發佈最初問題後的星期五發現的。 Z = [[0,0],[0,0]] levels = linspace(-1.5,5.5,11)#range(-1.4433333,5.5133333 + s,step) CS3 = plt.contourf(Z,levels ,cmap = mymap) plt.clf()'是我用來定義我的標量映射的基礎,它基於我在SO上發現的另一篇文章。但是,這裏提供的解決方案似乎更加直觀並且更直接地解決問題。謝謝! – Nigu

回答

3

答案爲止似乎過於複雜。 fig.colorbar()預計ScalarMappable作爲其第一個參數。通常ScalarMappable s由imshowcontour地塊生產,並且很容易獲得。

在這種情況下,您需要定義自定義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

當您通過Figure致電colorbar時,您應通過ImageContourSet。 您可以使用數據調用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的解決方案几乎工作,但它繪製的矩陣到同一個人物爲線。在這裏,打開第二個圖形解決方案,不會對第二號人物的imshow調用,使用其結果繪製colorbar第一幅圖,然後調用plt.show()之前關閉第二個數字:

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() 

結果看起來像這樣: