如何为 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')))
剧情:
我有一些这样的数据:
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')))
剧情: