Python matplotlib 根据较大数据集的值缩放 y

Python matplotlib scale y based on values from larger dataset

我想用从较大数据集中子集化的数据集中的值绘制图表,并且我想根据这些值在较大数据集中的位置缩放绘制的颜色。

例如,如果我有 df1(较大的数据集)和 df2(较小的数据集),我想从 df2 中绘制一个列,以便使用范围从红色到绿色的颜色图对这些点进行着色,其中限制是基于df1对应较大列的最小值(红色)和最大值(绿色)。

示例:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

n = 50
N = n*10
this_mean = 5
group_mean = 3

# column to plot
y = np.random.normal(this_mean, 1, 50)
x = list(range(n))

# From within larger dataset
Y = np.random.normal(group_mean,1,N)
X = list(range(N))

根据绘制在该轴上的数据进行缩放很好:

fig, ax = plt.subplots(1, 2, figsize=(10,4), sharey=True)

ax[0].scatter(x, y, c=y, cmap=cm.RdYlGn)
ax[1].scatter(X, Y, c=Y, cmap=cm.RdYlGn)
ax[0].set_title('subset')
ax[1].set_title('all')
plt.show()

在这个例子中,我真正想要的是左边图上的颜色与右边的颜色相对应,所以我们希望看到它的最小值被着色为橙色,而大多数其他点为非常绿色.

但是当我尝试按较大的数据 Y 进行缩放时,显然存在大小不匹配错误:

plt.scatter(x, y, c=Y, cmap=cm.RdYlGn)

ValueError: 'c' argument has 500 elements, which is not acceptable for use with 'x' with size 50, 'y' with size 50.

我不确定如何实现。此外,在此示例中,y 的数据实际上并未从 Y 中提取子集,但它们包含在我的实际数据集中。不过,我不确定这对解决方案是否重要。

您可以先绘制完整集,然后从中获取颜色图和归一化,然后将其应用于子集图。

# First plot the complete set
sc = ax[1].scatter(X, Y, c=Y, cmap=cm.RdYlGn)
# Plot the subset with the colormap and normalization
# taken from the complete set
ax[0].scatter(x, y, c=y, cmap=sc.cmap, norm=sc.norm)

更一般地说,您还可以在绘制任何内容之前定义颜色图和归一化,并将它们用于两个图。

cmap = cm.RdYlGn
norm = plt.Normalize(Y.min(), Y.max())

#...

ax[0].scatter(x, y, c=y, cmap=cmap, norm=norm)
ax[1].scatter(X, Y, c=Y, cmap=cmap, norm=norm)