2

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

我们得到这个:按 caseMean 排序

现在我们颠倒顺序

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

并使用上面的代码再次绘图,我们看到绘图已经改变了颜色:逆序案例

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

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

4

1 回答 1

1

如果您的新因素只是颠倒前一个因素的顺序,您可以使用 in 中的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 包(v0.3.0)于 2019 年 6 月 6 日创建

于 2019-06-06T16:01:59.910 回答