在R

时间:2019-06-06 15:39:45

标签: r ggplot2 ggridges

最近,这个社区极大地帮助了我,让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()

我们得到这个:sorted by caseMean

现在我们反转顺序

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

并再次使用上面的代码进行绘制,我们看到这些绘制已切换颜色:cases in reverse order

无论我放置的顺序如何,如何确保相同的箱子始终具有相同的颜色?

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

1 个答案:

答案 0 :(得分:1)

如果新因子正好颠倒前一个因子的顺序,则可以在direction中使用参数scale_fill_viridis_d()

对于更复杂的情况(即重新调整因子),可能的是可能会在原始数据框中手动添加颜色,并使用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-06-06创建