r - ggplot循环图形列具有匹配的前缀但不同的后缀
问题描述
我有一个大数据框,每列都包含一个高、低和高低。我也有一个 Base 专栏。我想为每组前缀创建一个图,以便折线图具有 A_H、A_L、A_HL 和 Base,然后对于所有其他匹配的前缀都相同。
date A_H B_H C_H D_H A_L B_L C_L D_L A_HL B_HL C_HL D_HL Base
2/1/18 6 4 6 4 2 3 5 8 9 2 3 5 3
2/2/18 2 4 7 6 5 8 3 9 11 12 5 9 5
2/3/18 8 6 8 9 6 9 7 9 13 13 6 7 5
我已经尝试了多种方法而没有它们的工作。
GraphList <- c("A", "B", "C", "D")
for (i in seq_along(GraphList)){
plot <- ggplot(df, aes(date)) +
geom_line(aes(y=Base, colour='Base')) +
geom_line(aes(y=paste0(i,"High"), colour='High')) +
geom_line(aes(y=paste0(i,"Low"), colour='Low')) +
geom_line(aes(y=paste0(i,"LS"), colour='LS'))
print(plot)
但是当我执行上述操作时,图表不会粘贴列表中的名称前缀,它只会在各自的图表中将 1H 和 1L、2H 和 2L 等作为平线吐出。
我也试过
plot <- ggplot(df, aes(date)) +
geom_line(aes(y=Base, colour='Base')) +
geom_line(aes(y=df[, grepl("_H", colnames(df))], colour='High')) +
geom_line(aes(y=df[, grepl("_L", colnames(df))], colour='Low')) +
geom_line(aes(y=df[, grepl("_LS", colnames(df))], colour='LS'))
print(plot)
使用这种方法我得到了错误
Don't know how to automatically pick the scale for object of type tbl_df/tbl/data.frame. Defaulting to continuous
Error: aesthetics must be either length 1 or the same as the data (63): y, colour, x
先感谢您。
解决方案
首先,如果将数据重新整形为“长”格式,我们可以让ggplot为我们做很多工作:
df <- read.table(text = 'date A_H B_H C_H D_H A_L B_L C_L D_L A_HL B_HL C_HL D_HL Base
2/1/18 6 4 6 4 2 3 5 8 9 2 3 5 3
2/2/18 2 4 7 6 5 8 3 9 11 12 5 9 5
2/3/18 8 6 8 9 6 9 7 9 13 13 6 7 5', header = T, stringsAsFactors = F)
library(tidyverse)
library(lubridate)
df.long <- df %>%
tidyr::gather(variable, value, -date, -Base) %>%
separate(variable, into = c('variable', 'measure'), sep = '_') %>%
mutate(date = mdy(date))
date Base variable measure value
1 2018-02-01 3 A H 6
2 2018-02-02 5 A H 2
3 2018-02-03 5 A H 8
4 2018-02-01 3 B H 4
5 2018-02-02 5 B H 4
6 2018-02-03 5 B H 6
7 2018-02-01 3 C H 6
8 2018-02-02 5 C H 7
9 2018-02-03 5 C H 8
10 2018-02-01 3 D H 4
df.long
将“Base”移动到自己的列中,其值针对“变量”(A、B、C、D)和“度量”(H、L、HL)的每个级别重复。我还将“日期”列转换为正确的日期数据,这将再次允许ggplot为我们做更多的工作。
首先,我们可以将所有这些都放在一个多面图中:
g <- ggplot(data = df.long, aes(x = date, y = value, color = measure)) +
geom_line() +
geom_line(aes(y = Base), color = 'black') +
facet_grid(facets = ~variable)
print(g)
或者我们可以使用一个循环来创建几个单独的绘图对象:
plots <- list()
for (i in unique(df.long$variable)) {
plots[[i]] <- ggplot(data = filter(df.long, variable == i), aes(x = date, y = value, color = measure)) +
geom_line() +
geom_line(aes(y = Base), color = 'black')
}
plots[[1]]
推荐阅读
- extract - 如何从相交的 VCF 文件中找到编码区域?
- javascript - 在 iOS/Android 上工作的打印按钮(仅在移动设备上)
- excel - 突出显示匹配的单元格
- powershell - Windows Powershell:Select-String 后的 Set-Clipboard 给出错误“找不到路径 'C:\MyDirectory\InputStream',因为它不存在”
- excel - 如何在新工作表excel VBA上放置超链接?
- javascript - 模拟测试函数的外部变量?
- autodesk-forge - 当我在 dwg 文件的放大模式下添加任何标记时,当笔划宽度变为负值时,它的行为异常我应该为它做什么
- ios - 关于 Swift 中 URLSessionDataTask 和 Combine 的问题
- mysql - 从 Laravel eloquent 的另一个相关表中获取小计
- python - 我的日期时间循环不起作用,if time==now 部分不起作用