如何为 R Plotly 散点图中的每个点显式分配唯一颜色?

How can I explicitly assign unique colors to every point in an R Plotly scatterplot?

我有一些这样的数据:

data <- data.frame(x=runif(500), y=runif(500), z=runif(500))

我想要一个散点图,每个维度(X、Y 和 Z)中的点都使用 RGB 值着色 independently/discretely。

这是我试过的:

代码:

library(dplyr)
library(plotly)

xyz_colors <- rgb(data$x, data$y, data$z)

plot_ly(data = data, 
    x = ~x, y = ~y, z = ~z, 
    color= xyz_colors, 
    type = 'scatter3d', 
    mode='markers') %>%
  layout(scene = list(xaxis = list(title = 'X'),
                      yaxis = list(title = 'Y'),
                      zaxis = list(title = 'Z')))

剧情:

RColorBrewer 认为我正在尝试从 500 种中间颜色创建一个连续的比例:

Warning messages:
1: In RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors

2: In RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors

使用 Plotly 在 R 中为这样的点着色的正确方法有哪些? 此外,通常如何使用 Plotly 分别为 R 中的数据点分配颜色?

为了澄清,我正在尝试为颜色格式为“#XXYYZZ”的每个点着色,其中 'XX' 00 和 FF 之间的值线性映射到 data$x 从 0 到1.即X维度决定红色量,Y维度决定绿色量,Z维度决定蓝色量。在 0,0,0 点应该是黑色的,在 1,1,1 点应该是白色的。这样做的原因是尽可能容易地可视化点的 3D 位置。

评论后更新的答案:

So, is there no way to color every point separately?

是的,这要归功于 add_traces() 的强大功能和灵活性。而且它比我最初想象的要简单得多。

只需设置一个具有一些所需 3D 功能的空绘图:

p <-plot_ly(data = data, type = 'scatter3d', mode='markers')

并在每个定义的颜色上循环应用 add_traces()

for (i in seq_along(xyz_colors)){
  p <- p %>% add_trace(x=data$x[i], y=data$y[i], z=data$z[i],
                       marker = list(color = xyz_colors[i], opacity=0.6, size = 5),
                       name = xyz_colors[i])
}

您可以像这样使用您选择的颜色轻松定义单个点:

p <- p %>% add_trace(x=0, y=0, z=0,
                       marker = list(color = rgb(0, 0, 0), opacity=0.8, size = 20),
                       name = xyz_colors[i])

剧情:

完整代码:

library(dplyr)
library(plotly)

# data and colors
data <- data.frame(x=runif(500), y=runif(500), z=runif(500))
xyz_colors <- rgb(data$x, data$y, data$z)

# empty 3D plot
p <-plot_ly(data = data, type = 'scatter3d', mode='markers') %>%
   layout(scene = list(xaxis = list(title = 'X'),
                      yaxis = list(title = 'Y'),
                      zaxis = list(title = 'Z')))

# one trace per color
for (i in seq_along(xyz_colors)){
  p <- p %>% add_trace(x=data$x[i], y=data$y[i], z=data$z[i],
                       marker = list(color = xyz_colors[i], opacity=0.6, size = 5),
                       name = xyz_colors[i])
}

# Your favorite data point with your favorite color
p <- p %>% add_trace(x=0, y=0, z=0,
                       marker = list(color = rgb(0, 0, 0), opacity=0.8, size = 20),
                       name = xyz_colors[i])

p

原回答:

在 3D 图中,您可以对所有点使用相同的颜色,使用不同的颜色区分不同的聚类或类别,或者您对每个点使用单独的颜色来说明第四个值(或第四个维度,如果你喜欢,如数据集中所述 here)。正如您所说,所有这些方法都是 '[...] correct ways to color the points [...]' 的示例。看看下面,看看这是否符合您的需求。我将 fourthVal <- data$x+data$y+data$z 作为额外维度的示例。您最终使用的内容将完全取决于您的数据集和您想要说明的内容。

代码:

library(dplyr)
library(plotly)

data <- data.frame(x=runif(500), y=runif(500), z=runif(500))

xyz_colors <- rgb(data$x, data$y, data$z)

fourthVal <- data$x+data$y+data$z

plot_ly(data = data, 
        x = ~x, y = ~y, z = ~z, 
        color= fourthVal, 
        type = 'scatter3d', 
        mode='markers') %>%
  layout(scene = list(xaxis = list(title = 'X'),
                      yaxis = list(title = 'Y'),
                      zaxis = list(title = 'Z')))

剧情: