从列表中获取名称和值到不同的图形

Getting names and values from a list on to different graphs

我有一个一直在使用的数据集和列表。我一直在尝试为列表 l 中的每个 ID 创建一个单独的图表。我想在 A 的图表中打印 A = 1,在 B 的图表中打印 B = 2,等等。在我的实际数据集中,ID 是在整个列表中重复不同的值,理想情况下,我希望打印在与 ID.

相关联的图表上的列表中的一个 ID 的所有值

这是我之前尝试过的方法,但是当我尝试查看图表时出现错误

Error: Aesthetics must be either length 1 or the same as the data (200): label
library(lubridate)
library(tidyverse)

date <- rep_len(seq(dmy_hms("01-01-2010 12:01:01"), dmy_hms("31-12-2013 01:59:59"), by = "days"),1000)
ID <- rep(c("A","B","C", "D", "E"), 100)

df <- data.frame(date = date,
                 x = runif(length(date), min = 60000, max = 80000),
                 y = runif(length(date), min = 800000, max = 900000),
                 ID, NSD = runif(length(date), min = 0, max = 100000))

l <- list(1,2,4,3,5)

df1 <- df %>% group_split(ID)
names(l) <- sapply(df1, function(x) x$ID[1])

id_labels <- tibble(
  ID = names(l),
  id_val = l
) %>% 
  # make desired labels for each facet
  group_by(ID) %>%
  summarise(label = paste(ID, id_val, sep = ": ", collapse = '\n'))


# Plot NSD
p.list <- lapply(sort(unique(df$ID)), function(i){
  ggplot(df[df$ID == i,], aes(x = date, y = NSD)) + 
    geom_line() + theme_bw() + 
    theme(axis.text.x = element_text(angle = 90)) +
    scale_x_datetime(date_breaks = '10 days', date_labels = '%y%j') +
    facet_grid( ~ ID, scales = "free") +
    scale_colour_manual(values=hcl(seq(15,365,length.out=4)[match(i, sort(unique(df$ID)))], 100, 65)) +
    geom_text(aes(x=min(date),y=max(NSD),label=paste0("EMD ",id_labels$label)),
              size = 2)
})

关于如何获得此输出有什么想法吗?

根据您的可重现示例,您可以这样做:

library(purrr)
library(ggplot2)

p.list <- imap(split(df, ID), ~ 
                 ggplot(.x, aes(x = date, y = NSD)) + 
                 geom_line() +
                 theme_bw() + 
                 theme(axis.text.x = element_text(angle = 90)) +
                 scale_x_datetime(date_breaks = '2 months', date_labels = '%y%j') +
                 geom_text(data = subset(id_labels, ID == .y), aes(label = label,
                                               x = as.POSIXct(-Inf, '1970-01-01'),
                                               y = max(.x$NSD),
                                               hjust = 0, 
                                               vjust = 0))
                 )

工作原理

  1. split 根据 ID.

    将您的数据框拆分为一个列表
  2. purrr::imap 遍历命名列表,将列表的元素存储为 .x 并将该元素的名称存储为 .y.

  3. 为了简单起见,我在你的 ggplot 中留下了几层,但你可以将它们重新添加进去。

  4. 您可能遇到的麻烦是当 x 刻度为日期时试图在图表上添加标签。你这样做的方法是使用 hjustvjust,但为了不抛出错误,x 坐标仍然必须是 POSIXct.

您可以尝试调整 hjustvjust 的值来移动您的标签。

输出

p.list$A