Разметить метки на концах линий в диаграмме с накоплением - PullRequest
0 голосов
/ 31 октября 2019

У меня есть следующий код

library(ggplot2)
library(dplyr)

# create data
time <- as.numeric(rep(seq(1,7),each=7))  # x Axis
value <- runif(49, 10, 100)               # y Axis
group <- rep(LETTERS[1:7],times=7)        # group, one shape per group
data <- data.frame(time, value, group)

# stacked area chart
ggplot(data, aes(x=time, y=value, fill=group)) + 
  geom_area()+
  geom_text(data = data %>% filter(time == last(time)), aes(label = group, 
                                                               x = time + 0.5, 
                                                               y = value, 
                                                               color = group)) + 
  guides(color = FALSE) + theme_bw() + 
  scale_x_continuous(breaks = scales::pretty_breaks(10))

Где я получаю enter image description here

Но я стремлюсь к ссылке

Есть ли какое-либо решение для участка с накоплением?

Ответы [ 3 ]

3 голосов
/ 31 октября 2019

Код вопроса отображает текстовые метки в value из последних time, когда фактически области являются кумулятивными. И в обратном порядке.

Кроме того, на следующем графике показаны данные, созданные с тем же кодом, но с

set.seed(1234)

Тогда код создания данных такой же, как в вопросе.

# stacked area chart
ggplot(data, aes(x=time, y=value, fill=group)) + 
  geom_area()+
  geom_text(data = data %>% 
              filter(time == last(time)) %>%
              mutate(value = cumsum(rev(value))), 
            aes(label = rev(group), 
                x = time + 0.5, 
                y = value, 
                color = rev(group))) + 
  guides(color = FALSE) + theme_bw() + 
  scale_x_continuous(breaks = scales::pretty_breaks(10))

enter image description here

Изменить.

После обсуждения в комментариях к этому ответу я решил разместить код на основе комментарий пользователя Джейк Каупп .

ggplot(data, aes(x = time, y = value, fill = group)) + 
  geom_area()+
  geom_text(data = data %>% filter(time == last(time)),
            aes(x = time + 0.5, y = value, 
                label = rev(group), color = rev(group)),
            position = position_stack(vjust = 0.5)) + 
  guides(color = FALSE) + 
  theme_bw() + 
  scale_x_continuous(breaks = scales::pretty_breaks(10))
0 голосов
/ 05 ноября 2019

Здесь мы идем

time <- as.numeric(rep(seq(1,7),each=8))  # x Axis
value <- runif(56, 10, 100)               # y Axis
group <- rep(LETTERS[1:8],times=7)        # group, one shape per group
data <- data.frame(time, value, group)
round_df <- function(x, digits) {
  # round all numeric variables
  # x: data frame 
  # digits: number of digits to round
  numeric_columns <- sapply(x, mode) == 'numeric'
  x[numeric_columns] <-  round(x[numeric_columns], digits)
  x
}

data$value<- round_df(data$value, 2)
# stacked area chart
ggplot(data, aes(x=time, y=value, fill=group)) + 
  geom_area()+
  geom_text(aes(x = time + 0.5, y = value, label=ifelse(time == max(time), group, NA)),position = position_stack(vjust = 0.5),check_overlap = TRUE)+
  guides(color = FALSE) + theme_bw()+ 
  scale_x_continuous(breaks = scales::pretty_breaks(10)) +
  geom_text(aes(label=ifelse(time != min(time) & time != max(time),value, NA)),position = position_stack(vjust = 0.5),check_overlap = TRUE)+
  geom_text(aes(x = time + 0.18,label=ifelse(time == min(time),value, NA)),position = position_stack(vjust = 0.5),check_overlap = TRUE)+
  geom_text(aes(x = time - 0.18,label=ifelse(time == max(time),value, NA)),position = position_stack(vjust = 0.5),check_overlap = TRUE)

И получаем enter image description here

Уровни фактора, но почему не буквы? Это следующий шаг:)

ОБНОВЛЕНО

только что преобразовал коэффициент в char data$group <- as.character(data$group) enter image description here

0 голосов
/ 31 октября 2019

Вы можете использовать функцию text, чтобы поместить текст в любое место. Например:

text(7.2, 350, "B", col="brown")
...