使用渐变按组对散点图进行颜色编码
Color code a scatter plot by group with a gradient
我有 XY
数据,我想使用 scatter
plot
和 R
的 plotly
包来绘制图表。
set.seed(1)
df <- data.frame(x=c(rnorm(30,1,1),rnorm(30,5,1),rnorm(30,9,1)),
y=c(rnorm(30,1,1),rnorm(30,5,1),rnorm(30,9,1)),
group=c(rep("A",30),rep("B",30),rep("C",30)),score=runif(90,0,1))
每个点都分配给三个组中的一个 (df$group
),并且得分在 [0,1]
范围内。
我正在寻找一种方法来绘制数据图表,以便每个组都用不同的颜色着色,但该颜色的阴影(或强度)反映了分数。
所以我认为这可行:
library(dplyr)
library(plotly)
plot_ly(marker=list(size=10),type='scatter',mode="markers",x=~df$x,y=~df$y,color=~df$score,colors=c("#66C2A5","#FC8D62","#8DA0CB")) %>%
layout(xaxis=list(title="X",zeroline=F,showticklabels=F),yaxis=list(title="Y",zeroline=F,showticklabels=F))
但我得到:
如果我只是按 group
颜色代码:
plot_ly(marker=list(size=10),type='scatter',mode="markers",x=~df$x,y=~df$y,color=~df$group,colors=c("#66C2A5","#FC8D62","#8DA0CB")) %>%
layout(xaxis=list(title="X",zeroline=F,showticklabels=F),yaxis=list(title="Y",zeroline=F,showticklabels=F))
我得到:
所以它看起来像是在混合 group
颜色和 score
渐变。
我正在寻找的是将左下角的组着色为绿色阴影(比如从 gray
到 darkgreen
),对应于 score
(从低到高) ),另外两组分别为橙色和蓝色。
使用 scales::colour_ramp
您可以使用快速功能自行创建颜色。我不确定如何让每个组内发生不同的渐变。注意我在这里使用 df$score = df$x + df$y
使映射更明显。
make_colour_gradient = function(x, brewer_palette = "Greens") {
min_x = min(x)
max_x = max(x)
range_x = max_x - min_x
x_scaled = (x - min_x) / range_x
# Chopping out first colour as it's too light to work well as a
# point colour
colours = scales::brewer_pal("seq", brewer_palette)(5)[2:5]
colour_vals = scales::colour_ramp(colours)(x_scaled)
colour_vals
}
df$score = df$x + df$y
df = df %>%
# Assign a different gradient to each group, these are the names
# of different palettes in scales::brewer_pal
mutate(group_colour = case_when(
group == "A" ~ "Greens",
group == "B" ~ "Oranges",
group == "C" ~ "Purples"
)) %>%
group_by(group) %>%
mutate(point_colour = make_colour_gradient(score, first(group_colour)))
plot_ly(marker=list(size=10),type='scatter',mode="markers",
x=~df$x,y=~df$y,color=~ I(df$point_colour)) %>%
hide_colorbar() %>%
layout(xaxis=list(title="X",zeroline=F,showticklabels=F),
yaxis=list(title="Y",zeroline=F,showticklabels=F))
结果:
这确实会显示错误消息,但它们似乎并不重要?添加图例可能会很棘手。
我不是 plotly 方面的专家,但是,您也可以在 ggplot 中使用 alpha 参数来获得相同的结果,然后将 ggplot 对象转换为 plotly。我知道 plotly 中也有一个 alpha 参数,但是,我发现它有点困难。
g <- ggplot(df, aes(x,y))+
geom_point(aes(color = group, alpha = score), size = 3)+
scale_color_manual(values = c("#66C2A5","#FC8D62","#8DA0CB"))+
scale_alpha_continuous(range = c(0.3,1))+
theme(panel.background = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
legend.position = "none")
gp <- ggplotly(g)
gp
我无法使用 plotly 很好地格式化图例,但是在 ggplot 中,我们可以保留图例(省略 legend.position = "none"
),我们得到以下内容:
您还可以使用 scale_alpha_continuous
中的 breaks
参数增加不同色调的数量。
我有 XY
数据,我想使用 scatter
plot
和 R
的 plotly
包来绘制图表。
set.seed(1)
df <- data.frame(x=c(rnorm(30,1,1),rnorm(30,5,1),rnorm(30,9,1)),
y=c(rnorm(30,1,1),rnorm(30,5,1),rnorm(30,9,1)),
group=c(rep("A",30),rep("B",30),rep("C",30)),score=runif(90,0,1))
每个点都分配给三个组中的一个 (df$group
),并且得分在 [0,1]
范围内。
我正在寻找一种方法来绘制数据图表,以便每个组都用不同的颜色着色,但该颜色的阴影(或强度)反映了分数。
所以我认为这可行:
library(dplyr)
library(plotly)
plot_ly(marker=list(size=10),type='scatter',mode="markers",x=~df$x,y=~df$y,color=~df$score,colors=c("#66C2A5","#FC8D62","#8DA0CB")) %>%
layout(xaxis=list(title="X",zeroline=F,showticklabels=F),yaxis=list(title="Y",zeroline=F,showticklabels=F))
但我得到:
如果我只是按 group
颜色代码:
plot_ly(marker=list(size=10),type='scatter',mode="markers",x=~df$x,y=~df$y,color=~df$group,colors=c("#66C2A5","#FC8D62","#8DA0CB")) %>%
layout(xaxis=list(title="X",zeroline=F,showticklabels=F),yaxis=list(title="Y",zeroline=F,showticklabels=F))
我得到:
所以它看起来像是在混合 group
颜色和 score
渐变。
我正在寻找的是将左下角的组着色为绿色阴影(比如从 gray
到 darkgreen
),对应于 score
(从低到高) ),另外两组分别为橙色和蓝色。
使用 scales::colour_ramp
您可以使用快速功能自行创建颜色。我不确定如何让每个组内发生不同的渐变。注意我在这里使用 df$score = df$x + df$y
使映射更明显。
make_colour_gradient = function(x, brewer_palette = "Greens") {
min_x = min(x)
max_x = max(x)
range_x = max_x - min_x
x_scaled = (x - min_x) / range_x
# Chopping out first colour as it's too light to work well as a
# point colour
colours = scales::brewer_pal("seq", brewer_palette)(5)[2:5]
colour_vals = scales::colour_ramp(colours)(x_scaled)
colour_vals
}
df$score = df$x + df$y
df = df %>%
# Assign a different gradient to each group, these are the names
# of different palettes in scales::brewer_pal
mutate(group_colour = case_when(
group == "A" ~ "Greens",
group == "B" ~ "Oranges",
group == "C" ~ "Purples"
)) %>%
group_by(group) %>%
mutate(point_colour = make_colour_gradient(score, first(group_colour)))
plot_ly(marker=list(size=10),type='scatter',mode="markers",
x=~df$x,y=~df$y,color=~ I(df$point_colour)) %>%
hide_colorbar() %>%
layout(xaxis=list(title="X",zeroline=F,showticklabels=F),
yaxis=list(title="Y",zeroline=F,showticklabels=F))
结果:
这确实会显示错误消息,但它们似乎并不重要?添加图例可能会很棘手。
我不是 plotly 方面的专家,但是,您也可以在 ggplot 中使用 alpha 参数来获得相同的结果,然后将 ggplot 对象转换为 plotly。我知道 plotly 中也有一个 alpha 参数,但是,我发现它有点困难。
g <- ggplot(df, aes(x,y))+
geom_point(aes(color = group, alpha = score), size = 3)+
scale_color_manual(values = c("#66C2A5","#FC8D62","#8DA0CB"))+
scale_alpha_continuous(range = c(0.3,1))+
theme(panel.background = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
legend.position = "none")
gp <- ggplotly(g)
gp
我无法使用 plotly 很好地格式化图例,但是在 ggplot 中,我们可以保留图例(省略 legend.position = "none"
),我们得到以下内容:
您还可以使用 scale_alpha_continuous
中的 breaks
参数增加不同色调的数量。