Python Matplotlib,具有共享颜色栏的多个散布子图

Python Matplotlib,具有共享颜色栏的多个散布子图,python,matplotlib,Python,Matplotlib,我正在尝试创建一个分散子图的集合,并希望它们共享相同的颜色栏 我遵循了指南,但它似乎仅适用于对象具有自动缩放属性的图像打印 我使用的代码如下: 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,1

我正在尝试创建一个分散子图的集合,并希望它们共享相同的颜色栏

我遵循了指南,但它似乎仅适用于对象具有自动缩放属性的图像打印

我使用的代码如下:

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:“AxeSubplot”对象没有“自动缩放\u无”属性

当我将数据发送到此处的颜色栏时出现问题:

f.colorbar(axes[0][0], cax=cbar_ax)
这是当前输出,显然,我希望标记的颜色位于右侧的比例尺上(稍后我会担心如何正确放置它):

对于像这样的一组散点图来说,实现这一点还有一段距离吗?如果有,我如何修改我的代码来实现它

的签名是

这意味着第一个参数必须是ScalarMappable,而不是axes

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

您可能需要通过
mpl.colorbar.colorbase
。如何定位颜色条,使其不与绘图重叠?您可以通过更改
f.add_轴([0.85,0.15,0.05,0.7])中的值来实现这一点。
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()