Цветные сегменты графика плотности по ячейкам - PullRequest
0 голосов
/ 06 августа 2020

Предупреждение, я новичок в R! У меня есть ошибка R, я играю с возможностями, но очень теряюсь. Я хочу попробовать и раскрасить сегменты графика плотности с условием '>', чтобы указать ячейки. В голове это выглядит так:

... но не зависит от квартиля или% изменения.

Мои данные показывают; x = продолжительность (количество дней) и y = частота. Я хотел бы, чтобы график разделился по цвету на 3-месячные интервалы до 12 месяцев и один цвет после (с использованием рабочих дней, т.е. 63 = 3 месяца).

У меня был go, но действительно не уверен, где для начала!

ggplot(df3, aes(x=Investigation.Duration))+
geom_density(fill = W.S_CleanNA$Investigation.Duration[W.S_CleanNA$Investigation.Duration>0],
           fill = W.S_CleanNA$Investigation.Duration[W.S_CleanNA$Investigation.Duration>63], color =     "white",
           fill = W.S_CleanNA$Investigation.Duration[W.S_CleanNA$Investigation.Duration>127], color = "light Grey",
           fill = W.S_CleanNA$Investigation.Duration[W.S_CleanNA$Investigation.Duration>190], color = "medium grey",
           fill = W.S_CleanNA$Investigation.Duration[W.S_CleanNA$Investigation.Duration>253], color = "dark grey",
           fill = W.S_CleanNA$Investigation.Duration[W.S_CleanNA$Investigation.Duration>506], color = "black")+

  ggtitle ("Investigation duration distribution in 'Wales' complexity sample")+
  geom_text(aes(x=175, label=paste0("Mean, 136"), y=0.0053))+
  geom_vline(xintercept = c(136.5), color = "red")+
  geom_text(aes(x=80, label=paste0("Median, 129"), y=0.0053))+
  geom_vline(xintercept = c(129.5), color = "blue")

Любая действительно простая помощь очень ценится.

1 Ответ

1 голос
/ 07 августа 2020

К сожалению, вы не можете сделать это напрямую с помощью geom_density, так как «под капотом» он построен с одним многоугольником, а многоугольник может иметь только одну заливку. Единственный способ сделать это - иметь несколько полигонов, и вам нужно построить их самостоятельно.

К счастью, это проще, чем кажется.

В вопросе не было образцов данных, поэтому мы создадим правдоподобное распределение с той же медианой и средним значением:

#> Simulate data
set.seed(69)
df3 <- data.frame(Investigation.Duration = rgamma(1000, 5, 1/27.7))

round(median(df3$Investigation.Duration))
#> [1] 129
round(mean(df3$Investigation.Duration))
#> [1] 136

# Get the density as a data frame
dens <- density(df3$Investigation.Duration)
dens <- data.frame(x = dens$x, y = dens$y)

# Exclude the artefactual times below zero
dens <- dens[dens$x > 0, ]

# Split into bands of 3 months and group > 12 months together
dens$band <- dens$x %/% 63
dens$band[dens$band > 3] <- 4

# This us the complex bit. For each band we want to add a point on
# the x axis at the upper and lower ltime imits:
dens <- do.call("rbind", lapply(split(dens, dens$band), function(df) {
  df <- rbind(df[1,], df, df[nrow(df),])
  df$y[c(1, nrow(df))] <- 0
  df
}))

Теперь у нас есть многоугольники, это просто случай рисования и маркировки соответствующим образом:

library(ggplot2)

ggplot(dens, aes(x, y)) + 
  geom_polygon(aes(fill = factor(band), color = factor(band))) +
  theme_minimal() +
  scale_fill_manual(values = c("#003f5c", "#58508d", "#bc5090",
                               "#ff6361", "#ffa600"), 
                    name = "Time",
                    labels = c("Less than 3 months",
                               "3 to 6 months",
                               "6 to 9 months",
                               "9 to 12 months",
                               "Over 12 months")) +
  scale_colour_manual(values = c("#003f5c", "#58508d", "#bc5090",
                               "#ff6361", "#ffa600"), 
                      guide = guide_none()) +
  labs(x = "Days since investigation started", y = "Density") +
  ggtitle ("Investigation duration distribution in 'Wales' complexity sample") +
  geom_text(aes(x = 175, label = paste0("Mean, 136"), y = 0.0053),
            check_overlap = TRUE)+
  geom_vline(xintercept = c(136.5), linetype = 2)+
  geom_text(aes(x = 80, label = paste0("Median, 129"), y = 0.0053),
            check_overlap = TRUE)+
  geom_vline(xintercept = c(129.5), linetype = 2)

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

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