Matplotlib,共享颜色条的多个散点子图

8
我正在尝试创建一组散点子图,并希望它们共享相同的颜色条。
我已经按照这里的指导进行了操作,但似乎只适用于绘制具有自动缩放属性的图像。
我使用的代码如下:
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

是否有一种方法可以实现这样一组散点图的效果,如果有,如何修改我的代码以实现它?


你可能需要一个独立的色条,可以通过 mpl.colorbar.ColorbarBase 实现。 - Andras Deak -- Слава Україні
1个回答

8

figure.colorbar的签名是:

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

这意味着第一个参数必须是一个标量映射,而不是一个坐标轴。
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


有什么方法可以将颜色条的位置调整到不与图形重叠? - Rylan Schaeffer
你可以通过更改f.add_axes([0.85, 0.15, 0.05, 0.7])中的值来实现。 - startswithH
如何使用pandas的df.plot.scatter实现这个功能? :) - Roelant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接