2017-07-07 205 views
0

我正在尝试创建散点子图的集合,并希望它们共享相同的颜色条。Matplotlib,具有共享颜色条的多个散点子图

我遵循指导here,但它似乎只适用于绘制对象具有自动比例属性的图像。

我使用的代码如下:

import matplotlib.pyplot as plt 
import numpy 
import random 

x = [] 
y = [] 

for i in range(100): 
    x.append(random.normalvariate(100,10)) 
    y.append(random.normalvariate(100,10)) 

#Creates a list of length n 
def getRand(n): 
    l = [] 
    for i in range(n): 
     l.append(random.normalvariate(1,10)) 
    return l 

f = plt.figure()  
f, axes = plt.subplots(nrows = 2, ncols = 2, sharex=True, sharey = True) 

axes[0][0].scatter(getRand(100),getRand(100), c = getRand(100), marker = "x") 
axes[0][0].set_xlabel('Crosses', labelpad = 5) 

axes[0][1].scatter(getRand(100),getRand(100), c = getRand(100), marker = 'o') 
axes[0][1].set_xlabel('Circles', labelpad = 5) 

axes[1][0].scatter(getRand(100),getRand(100), c = getRand(100), marker = '*') 
axes[1][0].set_xlabel('Stars') 

axes[1][1].scatter(getRand(100),getRand(100), c = getRand(100), marker = 's') 
axes[1][1].set_xlabel('Squares') 


#Add separate colourbar axes 
cbar_ax = f.add_axes([0.85, 0.15, 0.05, 0.7]) 

#Autoscale none 
f.colorbar(axes[0][0], cax=cbar_ax) 


plt.show() 

这将生成错误:

AttributeError的: 'AxesSubplot' 对象没有属性 'autoscale_None'

该问题发生时我将数据发送到颜色栏:

f.colorbar(axes[0][0], cax=cbar_ax) 

他再次是电流输出,很显然,我希望标记的颜色是比例尺上的权利(我会担心您正确地安装它以后):

enter image description here

是否有实现的远这对于一组散布图如这样,如果是的话,我如何修改我的代码来实现它?

+0

你可能需要[一个独立的彩条(https://matplotlib.org/examples/api/colorbar_only.html)可能通过' mpl.colorbar.ColorbarBase'。 –

回答

0

figure.colorbar签名是

colorbar(mappable, cax=None, ax=None, use_gridspec=True, **kw) 

这意味着第一参数必须是ScalarMappable,而不是轴。

sc = axes[0][0].scatter(..) 
fig.colorbar(sc, cax=cbar_ax) 

如果要使用相同的颜色条所有散点图,您需要使用相同的标准化为他们所有。

norm=plt.Normalize(-22,22) 
sc = axes[0][0].scatter(getRand(100),getRand(100), c = getRand(100), norm=norm) 
fig.colorbar(sc, cax=cbar_ax) 

一个完整的例子:

import matplotlib.pyplot as plt 
import numpy as np 

def getRand(n): 
    return np.random.normal(scale=10, size=n) 

f = plt.figure()  
f, axes = plt.subplots(nrows = 2, ncols = 2, sharex=True, sharey = True) 
norm=plt.Normalize(-22,22) 
sc = axes[0][0].scatter(getRand(100),getRand(100), c = getRand(100), marker = "x", norm=norm) 
axes[0][0].set_xlabel('Crosses', labelpad = 5) 

axes[0][1].scatter(getRand(100),getRand(100), c = getRand(100), marker = 'o', norm=norm) 
axes[0][1].set_xlabel('Circles', labelpad = 5) 

axes[1][0].scatter(getRand(100),getRand(100), c = getRand(100), marker = '*', norm=norm) 
axes[1][0].set_xlabel('Stars') 

axes[1][1].scatter(getRand(100),getRand(100), c = getRand(100), marker = 's', norm=norm) 
axes[1][1].set_xlabel('Squares') 

cbar_ax = f.add_axes([0.85, 0.15, 0.05, 0.7]) 

f.colorbar(sc, cax=cbar_ax) 

plt.show() 

enter image description here