指定散点图中每个点的颜色(matplotlib)

Posted

技术标签:

【中文标题】指定散点图中每个点的颜色(matplotlib)【英文标题】:Specify color of each point in scatter plot (matplotlib) 【发布时间】:2016-01-22 02:15:03 【问题描述】:

我有一个使用 matplotlib 创建的 3D 图,并且我有一个对应于每个点的 rbg 值列表。

我有 X、Y 和 Z 数据,然后我有一个表格的“颜色列表”:

[ (r,g,b), (r,g,b), ... , (r,g,b) ]

匹配每个 (x, y, z) 点。

现在,我有

fig = plt.figure()
ax = fig.add_subplot(111, projection = '3d')

ax.scatter(X, Y, Z)
plt.show()

合并这些 rgb 元组以便为每个点分配特定颜色的适当方法是什么?

【问题讨论】:

【参考方案1】:

如果您不想使用 for 循环(对于大型列表可能会非常慢)您可以将 scatter 命令与 RGB 颜色列表一起使用,但您需要将颜色指定为 RGB 的向量(或 RGBA)值介于 0 和 1 之间

X = [0, 1, 2]
Y = [0, 1, 2]
Z = [0, 1, 2]
C = np.array([[255, 0, 0], [0, 255, 0], [0, 0, 255]])
fig = plt.figure()
ax = fig.add_subplot(111, projection = '3d')

ax.scatter(X, Y, Z, c = C/255.0)
plt.show()

【讨论】:

颜色可以指定为十六进制字符串吗? 使用新的 matplotlib 版本(至少使用 mpl 版本 3.2.1),您可以直接传递颜色字符串。 IE。 ['b',green','red',...] 点的长度。【参考方案2】:

我使用for 循环将每种颜色分别分配给每个点。这是我的代码:

X = [1, 2, 3]
Y = [2, 5, 8]
Z = [6, 4, 5]
colors=["#0000FF", "#00FF00", "#FF0066"]

fig = plt.figure()
ax = fig.add_subplot(111, projection = '3d')


for i in range(len(X)):
    ax.scatter(X[i], Y[i], Z[i], color=colors[i])
plt.show()

for 循环逐点进行(因此 [i] 在每个 X、Y、Z 值前面)并逐个给出颜色。我在示例中使用了十六进制颜色,但如果您愿意,也可以使用其他颜色。

【讨论】:

这非常慢。【参考方案3】:

这是一个计算颜色而不是由文字列表指定的示例。

import matplotlib.pyplot as plt
import numpy as np

phi = np.linspace(0, 2*np.pi, 60)
x = np.sin(phi)
y = np.cos(phi)
rgb_cycle = np.vstack((            # Three sinusoids
    .5*(1.+np.cos(phi          )), # scaled to [0,1]
    .5*(1.+np.cos(phi+2*np.pi/3)), # 120° phase shifted.
    .5*(1.+np.cos(phi-2*np.pi/3)))).T # Shape = (60,3)

fig, ax = plt.subplots(figsize=(3,3))
ax.scatter(x,y, c=rgb_cycle, s=90)
fig.show()

【讨论】:

以上是关于指定散点图中每个点的颜色(matplotlib)的主要内容,如果未能解决你的问题,请参考以下文章

Matplotlib可视化散点图配置X轴为对数坐标并使用线条(line)连接散点图中的数据点基于分组变量配置数据点的颜色(connecting two coordinates with line

带有颜色渐变的 Matplotlib 3D 散点图

如何根据动画图中的发生时间对 3D 散点图进行颜色编码?

matplotlib 中具有重叠点的散点图的可视化

问题--在matplotlib的散点图中如何给不同种类颜色的点加标签?

在matplotlib上的散点图中为每个系列设置不同的颜色