我有一些带有一些玩具数据的散点图。
我想用点的颜色在给定点旁边绘制一个标签。
玩具示例:
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()
我需要以某种方式获取此点的颜色并更改color='green'
的{{1}}部分
如何在散点图中获得点的颜色?
颜色矢量color=color_of_the_point
被转换为颜色图,它还可以进行进一步的修改,例如标准化或alpha值。
sc有一种检索点坐标的方法:
c
因此,获得点颜色的方法也是合乎逻辑的,但我找不到这样的方法。
答案 0 :(得分:6)
散点图是PathCollection
,其子类为ScalarMappable
。 ScalarMappable
有一个方法to_rgba
。这可用于获取与颜色值对应的颜色。
在这种情况下
sc.to_rgba(c[idx])
请注意,问题中使用的数组是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()
答案 1 :(得分:0)
散点图是一个PathCollection
,如另一个答案所述。它具有get_facecolors()
方法,该方法返回用于渲染每个点的颜色。但是,仅在绘制散点图后才返回正确的颜色。因此,我们可以首先触发plt.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()
生成