获取散点的颜色

Sem*_*aki 5 python matplotlib scatter-plot

我有一些玩具数据的散点图。

我想在给定点旁边绘制一个带有该点颜色的标签。

玩具示例:

x = 100*np.random.rand(5,1)
y = 100*np.random.rand(5,1)
c = np.random.rand(5,1)

fig, ax = plt.subplots()
sc = plt.scatter(x, y, c=c, cmap='viridis')

# I want to annotate the third point (idx=2)
idx = 2  
ax.annotate("hello", xy=(x[idx],y[idx]), color='green', 
            xytext=(5,5), textcoords="offset points")
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我需要以某种方式获得这一点的颜色,并改变我的color='green'部分color=color_of_the_point

如何获得散点图中点的颜色?

颜色矢量c将转换为颜色图,并且还可以进行其他修改,例如归一化或alpha值。

SC拥有访问点的坐标的方法:

sc.get_offsets()
Run Code Online (Sandbox Code Playgroud)

因此,也有一种获取点颜色的方法是合乎逻辑的,但我找不到这种方法。

Abd*_*tir 7

散点图是PathCollection另一个答案中提到的。它有一个get_facecolors()方法可以返回用于渲染每个点的颜色。但是,只有在渲染散点图后才会返回正确的颜色。所以,我们可以先触发 aplt.draw()然后使用get_facecolors()

工作示例:

import matplotlib.pyplot as plt
import numpy as np

x = 100*np.random.rand(5)
y = 100*np.random.rand(5)
c = np.random.rand(5)

fig, ax = plt.subplots()
sc = ax.scatter(x, y, c=c, cmap='viridis')

idx = 2  
plt.draw()

col = sc.get_facecolors()[idx].tolist()

ax.annotate("hello", xy=(x[idx],y[idx]), color=col, 
            xytext=(5,5), textcoords="offset points")
plt.show()
Run Code Online (Sandbox Code Playgroud)

这产生

示例图


Imp*_*est 5

散点图是a PathCollection,它是子类ScalarMappable。甲ScalarMappable有一个方法to_rgba。这可用于获取与颜色值相对应的颜色。

在这种情况下

sc.to_rgba(c[idx])
Run Code Online (Sandbox Code Playgroud)

请注意,问题中使用的数组是2D数组,通常是不希望的。所以一个完整的例子看起来像

import matplotlib.pyplot as plt
import numpy as np

x = 100*np.random.rand(5)
y = 100*np.random.rand(5)
c = np.random.rand(5)

fig, ax = plt.subplots()
sc = plt.scatter(x, y, c=c, cmap='viridis')

# I want to annotate the third point (idx=2)
idx = 2  
ax.annotate("hello", xy=(x[idx],y[idx]), color=sc.to_rgba(c[idx]), 
            xytext=(5,5), textcoords="offset points")
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明