#r #ggplot2 #purrr
#r #ggplot2 #purrr
Вопрос:
У меня есть два набора данных, из которых я хотел бы сгенерировать гистограммы, показывающие, как данные перекрываются по имени (A, B, C). Я написал пользовательскую функцию, чтобы я мог использовать ggplot с map2.
Я бы хотел, чтобы графики были озаглавлены в соответствии с именем каждого набора данных, поэтому «A», «B», «C.» Кто-нибудь знает способ сделать это?
# load packages
library(ggplot2)
library(dplyr)
library(purrr)
## load and format data 1
df1_raw <- data.frame(name = c("A", "B", "C", "A", "C", "B"),
start = c(1, 3, 4, 5, 2, 1),
end = c(6, 5, 7, 8, 6, 7))
df1 <- split(x = df1_raw, f = df1_raw$name) # split data by name
df1 <- lapply(df1, function(x) Map(seq.int, x$start, x$end)) # generate sequence intervals
df1 <- map(df1, unlist) # unlist sequences
df1 <- lapply(df1, data.frame) # convert to df
## load and format data 2
df2_raw <- data.frame(name = c("C", "B", "C", "A", "A", "B"),
start = c(5, 4, 3, 4, 4, 5),
end = c(7, 8, 7, 6, 9, 6))
df2 <- split(x = df2_raw, f = df2_raw$name) # split data by name
df2 <- lapply(df2, function(x) Map(seq.int, x$start, x$end)) # generate sequence intervals
df2 <- map(df2, unlist) # unlist sequences
df2 <- lapply(df2, data.frame) # convert to df
## write custom ggplot function and generate graphs
gplot <- function(data1, data2) {
ggplot()
geom_histogram(data = data1, aes(x = X..i..), binwidth = 1, color = "grey", fill = "grey")
geom_histogram(data = data2, aes(x = X..i..), binwidth = 1, fill = "pink", alpha = 0.7)
labs(
title = ls(data1))
}
hist <- map2(df1, df2, gplot)
Я также попробовал следующее в поле title в моей функции:
deparse(substitute(data1))
Комментарии:
1. К вашему сведению — для форматирования кода вам нужны обратные метки (рядом с
1
ключом), а не одинарные кавычки2. Спасибо, я использовал неправильный символ и был действительно сбит с толку тем, почему он не работает.
3.
deparse(substitute(data1))
это обычный способ сделать это, но наличие его внутриpurrr
цикла усложняет задачу. Возможно, вам лучше всего отредактировать свою функцию, чтобы она принималаtitle
аргумент и добавлялаnames(df1)
его в список аргументов, которые вы перебираете.
Ответ №1:
Другой вариант, аналогичный тому, что @GregorThomas упомянул в комментариях, вы можете добавить переменную name в свой data.frames и извлечь из нее в своей gplot()
функции. Я также показал, как вы можете объединить несколько шагов обработки данных:
# load packages
library(ggplot2)
library(dplyr)
library(purrr)
## load and format data 1
df1_raw <- data.frame(name = c("A", "B", "C", "A", "C", "B"),
start = c(1, 3, 4, 5, 2, 1),
end = c(6, 5, 7, 8, 6, 7))
df1 <- df1_raw %>%
split(.$name) %>% # split data by name
imap(function(x, x_name) {
data.frame(value = Map(seq.int, x$start, x$end) %>% unlist,
name = x_name)
})
## load and format data 2
df2_raw <- data.frame(name = c("C", "B", "C", "A", "A", "B"),
start = c(5, 4, 3, 4, 4, 5),
end = c(7, 8, 7, 6, 9, 6))
df2 <- df2_raw %>%
split(.$name) %>% # split data by name
imap(function(x, x_name) {
data.frame(value = Map(seq.int, x$start, x$end) %>% unlist,
name = x_name)
})
## change the title component of your previous function
gplot <- function(data1, data2) {
ggplot()
geom_histogram(data = data1, aes(x = value), binwidth = 1, color = "grey", fill = "grey")
geom_histogram(data = data2, aes(x = value), binwidth = 1, fill = "pink", alpha = 0.7)
ggtitle(data1$name[1])
}
## plot it
map2(df1, df2, gplot)