Я строю ряд временных рядов на одной паре осей. Серии охватывают диапазон временных рамок — например, некоторые охватывают год, некоторые только несколько месяцев. Я хотел бы, чтобы на результирующих диаграммах отображалась одна линия для каждой серии, причем каждая линия была видна только для периода времени, который охватывает серия.
Данные, лежащие в основе диаграммы, представляют собой формат фрейма данных (meltdf2
) с 4 столбцами: месяц, пользователь, оценка и риск.
Упрощенная версия будет:
Month user score risk
jan-18 A 1 high
feb-18 A 1 high
mar-18 A 2 mid
apr-18 A 1 high
feb-18 B 1 high
mar-18 B 2 mid
apr-18 B 3 low
mar-18 C 3 low
apr-18 C 3 low
В настоящее время на диаграмме отображаются три строки, по одной для каждого пользователя, каждая строка покрывает всю диаграмму.
В идеале я бы хотел, чтобы диаграмма с линией A
занимала всю ширину диаграммы, а линии B
и C
— только часть диаграммы.
Я попытался включить значения NA для месяцев, не охватываемых B
и C
, но их линии по-прежнему охватывают всю диаграмму. Не выполнив маршрут значения NA, я попытался вручную установить несколько цветов в одной строке, но это, похоже, не работает.
Текущий код, который я использую, выглядит следующим образом:
#create colour palette based on discrete risk levels - used to specify manual colour scale in plot.
pal <- c("High" = "red2","Mid" = "gold","Low" = "limegreen","NA"= "NA")
#create plot with line and points.
#colour of points based on colour column of meltdf2
ggplot(data = meltdf2, aes(x = Month, y = user, group = user)) +
geom_line(linetype = "dashed", colour = "grey") +
geom_point(aes(colour = meltdf2$risk, size = 3)) +
scale_colour_manual(values = pal, limits = names(pal)) +
scale_x_date(date_breaks = "1 month" , date_labels = "%b-%y") +
theme(axis.title.y=element_blank(), axis.text.y=element_blank(), axis.ticks.y=element_blank(),
axis.line.x = element_line(colour = "darkgrey"),
panel.background = element_rect(fill = "white"),
panel.grid.major = element_blank(), panel.grid.minor = element_blank())
Этот код создает следующую диаграмму:
В идеале участок каждой из серых пунктирных линий до первой точки данных для каждой серии не будет отображаться.
@teunbrand Я внес некоторые изменения в вопрос - надеюсь, теперь стало понятнее
Я не могу воспроизвести вашу проблему с предоставленным фрагментом данных. Кроме того, ваш фрагмент данных не похож на data.frame, который вы предоставляете ggplot, на основе имен столбцов/аргументов ggplot, так что это также сбивает с толку. Мое лучшее предположение было бы
ggplot(df, aes(Month, score, group = user)) + geom_line() + geom_point(aes(colour = colour)) + scale_colour_identity()