r - 从列表中获取名称和值到不同的图表
问题描述
我有一个我一直在使用的数据集和列表。我一直在尝试为ID
列表中的每个创建一个单独的图表l
。我想A = 1
在图表中打印A
,B = 2
在图表中等B
。在我的实际数据集中,ID
s 在整个列表中重复不同的值,理想情况下,我希望将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))
)
这个怎么运作
split
将您的数据框拆分为基于ID
.purrr::imap
遍历一个命名列表,将列表的元素存储为 ,并将该元素的.x
名称存储为.y
.为了简单起见,我在您的 ggplot 中留下了几层,但您可以将它们重新添加。
您可能遇到的麻烦是当 x 比例是日期时,尝试在图表上放置标签。你这样做的方式是使用
hjust
andvjust
,但为了不引发错误,x 坐标仍然必须是POSIXct
。
您可以尝试调整 和 的值hjust
来vjust
移动标签。
输出
p.list$A
推荐阅读
- flutter - 带有fastlane和match的ios/android颤振应用程序的工作流程CICD gitlab
- php - 当响应返回状态为 104(但适用于状态 200)时,Laravel 7 在访问外部 api 时给出 500 错误
- java - 如何获取下面指示的节点的子节点数?
- azure - Istio 多集群复制控制平面:HTTP/1.1 503 Service Unavailable
- c++ - ADsOpenObject 与 ADS_USE_SSL 绑定不成功
- ios - ios 13.6 或 ipadios 是否可以自动启动在 ipad 启动时执行特定操作的应用程序?
- html - 如何从编码的网址更改 svg 图像的颜色?
- c++ - 使用 Hunter 构建 SDL2
- python - Peewee 查询在多线程下运行缓慢
- android - Kivy android 应用程序崩溃