首页 > 解决方案 > 从列表中获取名称和值到不同的图表

问题描述

我有一个我一直在使用的数据集和列表。我一直在尝试为ID列表中的每个创建一个单独的图表l。我想A = 1在图表中打印AB = 2在图表中等B。在我的实际数据集中,IDs 在整个列表中重复不同的值,理想情况下,我希望将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)
})

关于我能做些什么来获得这个输出有什么想法吗?

标签: rggplot2tidyversetidyr

解决方案


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

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 比例是日期时,尝试在图表上放置标签。你这样做的方式是使用hjustand vjust,但为了不引发错误,x 坐标仍然必须是POSIXct

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

输出

p.list$A

在此处输入图像描述


推荐阅读