用梯度对散点图进行颜色编码

时间:2018-07-20 00:58:20

标签: r plotly gradient scatter-plot

我有XY数据,我想使用scatter的{​​{1}}包使用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]

但是我得到: enter image description here

如果我只是用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

我得到: enter image description here

因此,看起来好像是在混合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(从低到高)相对应的绿色阴影(例如,从graydarkgreen)着色,对于其他两个橙色和蓝色分别是相同的。

2 个答案:

答案 0 :(得分:6)

使用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))

结果:

https://www.w3schools.com/css/css3_border_images.asp

这确实会显示错误消息,但是它们似乎并不重要?在其中添加图例可能会很棘手。

答案 1 :(得分:3)

我不是plotly的专家,但是,您也可以在ggplot中使用alpha参数并获得相同的结果,然后将ggplot对象转换为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

enter image description here

我无法使图例很好地用plotly格式化,但是在ggplot中,我们可以保留图例(省略legend.position = "none"),并得到以下内容: enter image description here

您还可以使用breaks中的scale_alpha_continuous参数来增加不同阴影的数量。