【问题标题】:Assigning specific colors to specific cases in ridgeline plots in R在R中的脊线图中为特定案例分配特定颜色
【发布时间】:2019-10-22 04:07:07
【问题描述】:

最近,这个社区极大地帮助了我让 Ridgeline 图与我的数据一起使用。 现在我正在努力根据我的需要为它们着色。 基本上我想要的是以不同的顺序绘制我的案例,但它们应该保持特定的颜色,这样即使以不同的顺序绘制,观察结果仍然可以识别。到目前为止,我未能将可用的解决方案应用于我的要求。

让我们以这个数据为例,我们有一个名字、一个平均值和一个 SD:

caseName    caseMean    caseSD
Svansdottir 2006    -0.0646 0.4032398
Guétin 2009 -0.4649 0.3995663
Raglio 2010a    -0.2145 0.2814031

让我们先按 caseMean 对它们进行排序:

df$caseName <- factor(df$caseName, levels = df$caseName[order(df$caseMean)])

并使用以下代码绘制它:

library(tidyverse); library(ggridges)
n = 100
df3 <- df %>%
  mutate(low  = caseMean - 3 * caseSD, high = caseMean + 3 * caseSD) %>%
  uncount(n, .id = "row") %>%
  mutate(x    = (1 - row/n) * low + row/n * high, 
         norm = dnorm(x, caseMean, caseSD))
ggplot(df3, aes(x, caseName, height = norm, fill=caseName)) +
  geom_ridgeline(scale = 2,alpha=0.75) +
  scale_fill_viridis_d()

我们得到这个:

现在我们颠倒顺序

df$caseName <- factor(df$caseName, levels = df$caseName[order(-df$caseMean)])

用上面的代码再次绘图,我们看到绘图已经改变了颜色:

我怎样才能确保相同的箱子无论我放入的顺序如何都始终具有相同的颜色?

我希望拥有不需要我将颜色“硬连线”到特定案例名称的代码。我希望能够对具有 20、30 或更多观察值的山脊线图执行此操作。我选择了 viridis 调色板这一事实并不重要。我对任何解决方案都很满意(比如 heat.colors 或类似的东西)。

【问题讨论】:

    标签: r ggplot2 ggridges ridgeline-plot


    【解决方案1】:

    如果您的新因素只是颠倒前一个因素的顺序,您可以在scale_fill_viridis_d() 中使用参数direction

    对于更复杂的情况(即重新调整因子),一种可能性是手动添加颜色,可能在您的原始数据框中,并使用scale_fill_manual() 提供它

    简单案例:因子倒序

    library(tidyverse)
    df <- data.frame(name = letters[3:1], value = c(3,1,2))
    
    pl_1 <- ggplot(aes(x=name, y=value, fill=name), data=df)+
      geom_col() +
      scale_fill_viridis_d()
    
    pl_1
    

    pl_1 %+% mutate(df, name = factor(name, levels = c("c", "b", "a"))) +
      scale_fill_viridis_d(direction=-1)
    #> Scale for 'fill' is already present. Adding another scale for 'fill',
    #> which will replace the existing scale.
    

    更复杂的情况

    library(tidyverse)
    library(viridis)
    
    df_new <- tibble(name = letters[3:1], value = c(3,1,2),
                         col = rev(viridis(3))) %>% 
      mutate(name = factor(name, levels = c("c", "b", "a"))) %>% 
      arrange(name)
    
    df_new %>% 
      ggplot(aes(x=name, y=value, fill=name)) +
      geom_col() +
      scale_fill_manual(values=df_new$col)
    

    reprex package (v0.3.0) 于 2019 年 6 月 6 日创建

    【讨论】:

    • 感谢您的努力和回复!恐怕我不完全明白那里发生了什么。当我像这样按值对观察进行排序时: df_new$name
    猜你喜欢
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    相关资源
    最近更新 更多