2017-06-02 31 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() 

结果看起来像这样: