在堆积面积图中的线条末端绘制标签

Plot labels at ends of lines in stacked area chart

我有以下代码

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))

我在哪里

但我的目标是

堆积面积图有解决办法吗?

问题代码绘制了最后 timevalue 中的文本标签,而实际上这些区域是累积的。并以相反的顺序。

此外,下图绘制了使用相同代码但

创建的数据
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))

编辑。

根据对该答案的评论中的讨论,我决定 post 基于 by user Jake Kaupp 的代码。

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))

您可以使用 text 功能将文本放置在您想要的任何位置。例如:

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

我们开始

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)

并得到

因子水平但为什么不是字母?那就是下一步:)

已更新

刚刚将 factor 转换为 char data$group <- as.character(data$group)