Изменение цветов точек и линий в ggplot R

Пример кода:

library(ggplot)
par(mfrow=c(1,1))
dates15=seq(as.POSIXct("2015-01-01 00:00:00"), as.POSIXct("2015-12-31 23:45:00"), by="15 min", tz="GMT")
ex1=rnorm(35040, 150, 2)
point=rep("Control", 35040)
red=c(1000:2000, 4000:5000, 10000:10500)
point[red]="Not Controlled"
gr.cols=c("black", "red")
DF=data.frame(Date=dates15,Data=ex1, Type=point)
ggplot(DF, aes(Date, Data,colour=Type))+geom_point()+geom_line()+scale_color_manual(values=gr.cols)

Как создать линейный график с цветными точками в соответствии с моим вектором red без красной линии, идущей от последней красной точки к следующей? В моем примере кода есть красная линия от точки 2000 до 4000, но я этого не хочу. Мне нужна только линия между последовательными точками, которая окрашена в красный цвет, только если следующая точка также красная.

Я могу поменять местами geom_line и geom_point, но линия все еще там, она просто скрыта под черными точками и не решает проблему.


person sym246    schedule 22.12.2015    source источник


Ответы (1)


Ваша проблема в том, что ggplot автоматически группирует все «похожие» наблюдения (чтобы они были окрашены одинаково) в одну группу. Исправить это довольно просто: создайте группирующую переменную. Для этого мы можем использовать функцию rleid из пакета data.table.

library(data.table)
DF$group_ID <- rleid(DF$Type)

Затем мы добавляем группирующую переменную в вызов ggplot:

ggplot(DF, aes(Date, Data,colour=Type, group=group_ID))+
  geom_point()+
  geom_line()+
  scale_color_manual(values=gr.cols)

введите здесь описание изображения

Или, если нам нужна непрерывная линия между всеми точками, мы можем просто использовать group=1 внутри aes.

Это вызывает соединение между всеми точками без группировки. Каждый сегмент имеет цвет предыдущей точки.

person Heroka    schedule 22.12.2015
comment
Это именно то, чего я хочу. Спасибо! - person sym246; 22.12.2015
comment
Вы знаете, возможно ли получить линию между различными группами? т.е. в вашем решении нет линий между красными и черными точками. Могу ли я как-то соединить их линиями? - person sym246; 22.12.2015
comment
С некоторой манипуляцией с данными, да. Какого цвета должна быть линия? - person Heroka; 22.12.2015
comment
Идеально красный, если предыдущая точка красная и черная, если предыдущая точка черная? Если такой возможности нет, то черный для всех. - person sym246; 22.12.2015
comment
Я этого не видел, так как данные довольно плотные. Решит ли вашу проблему забвение о rleid и установка группы в 1 внутри aes (aes(..., group=1))? Иногда я думаю слишком сложно. - person Heroka; 22.12.2015
comment
Да, это хорошо сработало. Я тоже думал слишком сложно и даже не подумал об этом. Спасибо еще раз. - person sym246; 22.12.2015