【问题标题】:How to plot different shades of a color for each point in a scatter plot in matplotlib?如何在matplotlib的散点图中为每个点绘制不同的颜色阴影?
【发布时间】:2021-01-08 05:31:09
【问题描述】:

我正在尝试绘制一个散点图,其中散点图中的每个点都应对应于我的 选择 的给定颜色的特定 阴影。 mpl 文档指出,如果我设置如下:

color = '0.7'

它给了我一个灰色阴影,具有0.7 的缩放强度。我正在从一个值在 0 到 1 之间的数组中读取颜色的强度,每个值对应于散点图中该点的强度。我的代码如下:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import math

tsne_embeddings = np.load("tsne_embeddings.npy")
labels = np.load('labels.npy')
weights = np.load('weights.npy')
# Scale the weights from 0 to 1
max_weight = max(weights)
min_weight = min(weights)
weights = (weights - min_weight)/(max_weight - min_weight)
print(tsne_embeddings.shape)
x = list(tsne_embeddings[:,0])
y = list(tsne_embeddings[:,1])
labels = list(labels)

weights = np.round(weights,decimals=2)
weights = (np.exp(weights) - 1)/(np.exp(1) - 1)
weights = list(weights)
print(min(weights),max(weights))

for i, shade in enumerate(weights):
    plt.scatter(x[i],y[i],color=shade,marker = '+')

plt.show()

我正在以指数方式缩放这些权重,希望得到更好的变化。 所以,基本上,我的问题是:

  1. 如何将颜色更改为蓝色、红色或绿色,而不仅仅是灰度?
  2. 我遵循的灰度方法是否正确?

谢谢!

【问题讨论】:

    标签: python matplotlib colors scatter-plot scatter


    【解决方案1】:

    要使您的方法适用于灰色阴影,您需要将值转换为字符串,因此plt.scatter(..., color=str(shade))

    使用 matplotlib 的更标准的方法是直接使用权重,而不将它们重新缩放到 01 的范围内,使用颜色图,并直接使用数组调用 scatter。权重进入c= 参数。对于灰度值,这将是plt.scatter(x, y, c=weights, cmap='Greys', marker='+')。 matplotlib 的另一个特性是,利用这些信息,它可以自动创建一个颜色条,将灰度值映射到相应的权重。如果只创建一个散点图,plt.colorbar() 不带参数将显示此颜色条。

    'Purples', 'Blues', 'Greens', 'Oranges', 'Reds', ... 查看official doc 的完整列表。如果明暗之间的范围出现错误,则在名称后附加“_r”将使用相反的颜色范围(因此,“Greys”从白色变为黑色,而“Greys_r”从黑色变为白色)。

    下面是一个使用 1 到 10 的值作为三个数组的工作示例:

    from matplotlib import pyplot as plt
    import numpy as np
    
    x = np.arange(1, 11)
    y = np.arange(1, 11)
    weights = np.arange(1, 11)
    plt.scatter(x, y, c=weights, cmap='Greys', marker='+')
    plt.colorbar()
    plt.show()
    

    【讨论】:

      【解决方案2】:

      您可以在 python 中使用颜色图来生成不同深浅的蓝绿色等。 https://matplotlib.org/3.1.0/tutorials/colors/colormaps.html 我在这里使用 Blues 颜色图

      import matplotlib.pyplot as plt
      import matplotlib as mpl
      norm = mpl.colors.Normalize(vmin=min(weights), vmax=max(weights))
      cmap = mpl.cm.ScalarMappable(norm=norm, cmap=mpl.cm.Blues)
      for i, xi in enumerate(x):
          plt.scatter(x[i],y[i],color=cmap.to_rgba(i+1),marker = '+')
      plt.show()
      

      【讨论】:

      • 非常感谢!我如何准确地传递我的体重?或者是在 norm = mpl.colors 中自动传递的。 .........行,何时调用最大值和最小值?基本上我的问题是我的scatter 怎么知道 tp 从哪里挑选权重?
      猜你喜欢
      • 2020-07-22
      • 2015-03-29
      • 1970-01-01
      • 2016-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多