如何在 matplotlib 的散点图中为每个点绘制不同颜色的阴影?

How to plot different shades of a color for each point in a scatter plot in matplotlib?

我正在尝试绘制一个散点图,其中散点图中的每个点都应对应于我的 选择[=] 给定颜色的特定 阴影 26=]。 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. 我采用的灰度方法是否正确?

谢谢!

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

使用 matplotlib 的更标准方法是直接使用权重,而不将它们重新缩放到 01 的范围,使用颜色图,并直接使用数组调用散点图.权重进入 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()

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

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