【问题标题】:Python matplotlib scale y based on values from larger datasetPython matplotlib 根据来自较大数据集的值缩放 y
【发布时间】:2019-09-02 18:43:23
【问题描述】:

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

例如,如果我有 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 子集的,但它们是我的实际数据集。不过,我不确定这对解决方案是否重要。

【问题讨论】:

    标签: python-3.x matplotlib colormap


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-06
      • 1970-01-01
      • 2016-10-14
      相关资源
      最近更新 更多