Присвоение определенных цветов конкретным случаям на графиках ребристой линии в R - PullRequest
1 голос
/ 06 июня 2019

В последнее время это сообщество очень помогло мне получить графики 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 Ответ

1 голос
/ 06 июня 2019

Если ваш новый фактор просто меняет порядок предыдущего, вы можете использовать аргумент 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)

Создано в 2019-06-06 пакетом Представить (v0.3.0)

...