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

问题描述

我正在尝试绘制一个散点图,其中散点图中的每个点都应对应于给定颜色的选择的特定阴影。 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()将显示此颜色条。

存在类似的颜色图,包括“紫色”,“蓝色”,“绿色”,“橙色”,“红色”,...以及完整列表,请参见official doc。如果明暗之间的范围走错了方向,请在名称后面加上“ _r”将使用相反的颜色范围(因此,“灰色”从白色变为黑色,而“灰色_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,marker='+')
plt.colorbar()
plt.show()

example plot

,

您可以在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()