Назначение множества цветов линий на основе группы в ggplot - PullRequest
2 голосов
/ 23 февраля 2020

Предположим, у меня есть некоторый код, подобный следующему, генерирующий линейный участок со значительным количеством строк (пример взят из здесь )

library(ggplot2)
library(reshape2)

n = 1000
set.seed(123)

mat = matrix(rnorm(n^2), ncol=n)
cmat = apply(mat, 2, cumsum)
cmat = t(cmat)
rownames(cmat) = paste("trial", seq(n), sep="")
colnames(cmat) = paste("time", seq(n), sep="")

dat = as.data.frame(cmat)
dat$trial = rownames(dat)
mdat = melt(dat, id.vars="trial")
mdat$time = as.numeric(gsub("time", "", mdat$variable))


p = ggplot(mdat, aes(x=time, y=value, group=trial)) +
    theme_bw() +
    theme(panel.grid=element_blank()) +
    geom_line(size=0.2, alpha=0.1)

enter image description here

Итак, здесь "номер испытания" - моя группа, производящая все эти линии, и есть 1000 испытаний. Предположим, я хочу «сгруппировать свою переменную группировки», то есть я хочу видеть точно такие же линии на этом графике, но я хочу, чтобы первые 500 пробных линий были одного цвета, а следующие 500 пробных линий - другим. Как я могу сделать это с ggplot? Некоторое время я ковырялся и не могу понять, как вручную установить цвета для каждой группы.

Ответы [ 2 ]

3 голосов
/ 23 февраля 2020

Добавьте переменную, разделяющую данные на две группы, затем добавьте ее, чтобы закрасить линии в ggplot

dat = as.data.frame(cmat)
dat$trial = rownames(dat)
dat$group = rep(c("a","b"), each = n/2)
mdat = melt(dat, id.vars=c("trial", "group"))
mdat$time = as.numeric(gsub("time", "", mdat$variable))


p = ggplot(mdat, aes(x=time, y=value, group=trial, color = group)) +
  theme_bw() +
  theme(panel.grid=element_blank()) +
  geom_line(size=0.2, alpha=0.1)
2 голосов
/ 23 февраля 2020

Одним из возможных решений будет создание нового столбца с индексом номера пробной версии, а затем с помощью условия ifelse вы можете установить другую группу на основе номера пробной версии и передать переменную группировки как color in aes например:

mdat %>% mutate(Trial = as.numeric(sub("trial","",trial))) %>%
  mutate(Group = ifelse(Trial < 51,"A","B")) %>%
  ggplot(aes(x=time, y=value, group=trial, color = Group)) +
  theme_bw() +
  theme(panel.grid=element_blank()) +
  geom_line(size=0.2, alpha=0.8)

enter image description here

Это то, что вы ищете?


Примечание: я использую только n = 100, чтобы получить самый маленький кадр данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...