R 使用渐变按组对散点图进行颜色编码

R 使用渐变按组对散点图进行颜色编码,r,plotly,gradient,scatter-plot,R,Plotly,Gradient,Scatter Plot,我有XY数据,我想使用scatterplot,使用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)),sc

我有
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))
但我得到:

如果我只是通过
组对代码进行颜色编码

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))
我得到:

所以它看起来像是混合了
颜色和
分数
渐变


我想要的是将左下角的组涂成绿色(比如从
灰色
深绿色
),对应于
分数
(从低到高),另外两组分别涂成橙色和蓝色

使用
scales::color\u 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

g它们并不意味着与x和y相关。x和y只需按组将点分开(假设“A”是狗,“B”是猫,“C”是老鼠)。分数是一个正交测量(例如,耗水量),如果我理解正确,您希望3个不同组有3个不同的颜色梯度,其中梯度颜色编码分数。我认为这是不可能的。有一些黑客式的方法可以实现。为什么不在组别中使用不同的符号,然后在比例中使用一个通用的颜色渐变呢?如果渐变不可能,符号将是另一种选择。好吧,我支持更正;-)很不错的。我认为这是不可能的。
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