에서 생성 한 여러 플롯을 ggplot2
목록 에 저장하려고 합니다.
이전 스레드 에서 제안한 목록 기능을 사용하려고 하지만 내 요구 사항을 충족하기 위해 자체 기능을 만드는 데 어려움이 있습니다.
먼저 다음 코드를 사용하여 요소를 기반으로 데이터 프레임을 목록으로 분할합니다.
heatlist.germ <- split(heatlist.germ, f=as.factor(heatlist.germ$plot))
그런 다음 나중에 사용할 수있는 목록 함수를 만들려고합니다 lapply
.
plot_data_fcn <- function (heatlist.germ) {
ggplot(heatlist.germ[[i]], aes(x=posX, y=posY, fill=germ_bin)) +
geom_tile(aes(fill=germ_bin)) +
geom_text(aes(label=germ_bin)) +
scale_fill_gradient(low = "gray90", high="darkolivegreen4") +
ggtitle(plot) +
scale_x_continuous("Position X", breaks=seq(1,30)) +
scale_y_continuous("Position Y (REVERSED)", breaks=seq(1,20))
}
heatlist.test <- lapply(heatlist.germ[[i]], plot_data_fcn)
내가 달성하려는 두 가지 주요 사항 :
plot
)을 목록에 저장합니다.어떤 도움을 주시면 감사하겠습니다.
귀하의 데이터가 없으므로 플로팅 메커니즘을 단순화하겠습니다.
첫 번째 문제는 [[i]]
함수에서 참조를 사용해서는 안된다는 것입니다. 함수가 데이터를있는 그대로 처리하도록하면 인수가 (다른 환경에서) 목록이있는 요소라는 사실을 알지 못합니다. 대상 자체 만 알고 있습니다.
# a simple plot function
myfunc <- function(x) ggplot(x, aes_string(names(x)[1], names(x)[2])) + geom_point()
# a list of frames, nothing fancy here
datalist <- replicate(3, mtcars, simplify = FALSE)
# just call it ...
myplots <- lapply(datalist, myfunc)
class(myplots[[1]])
# [1] "gg" "ggplot"
myfunc
를 호출 하면 인수 x
가 a data.frame
일 뿐이며 함수는 x
프레임 목록에서 첫 번째 (또는 두 번째 또는 세 번째) 프레임인지 알 수 없습니다 .
어떤 요소인지를 나타내는 인덱스와 함께 n 번째 프레임을 포함하려면 내 뷰에서 데이터를 함께 "압축"하므로 Map
. ( purrr::imap
또는 관련 tidyverse 기능을 사용할 수 있습니다 .)
myfunc2 <- function(x, title = "") ggplot(x, aes_string(names(x)[1], names(x)[2])) + geom_point() + labs(title = title)
myplots <- Map(myfunc2, datalist, sprintf("Plot number %s", seq_along(datalist)))
class(myplots[[1]])
# [1] "gg" "ggplot"
와의 Map
관련성 을 이해하려면 lapply
다음 lapply(datalist, myfunc)
과 같은 "언 롤링"되어 있음을 이해하십시오 .
myfunc(datalist[[1]])
myfunc(datalist[[2]])
myfunc(datalist[[3]])
Map
그러나를 사용하면 각 호출에서 하나 이상의 인수 를 받아야하는 하나의 함수를 사용합니다 . 이를 통해 Map
함수가 인수를 허용하는만큼 목록 (또는 벡터)을 허용합니다. 두 기능은 동의어입니다.
lapply(datalist, myfunc) # data first, function second
Map(myfunc, datalist) # function first, data second
더 복잡한 호출은 다음과 같이 펼쳐집니다.
titles <- sprintf("Plot number %d", seq_along(datalist)) # "Plot number 1", ...
Map(myfunc2, datalist, titles)
# equivalent to
myfunc2(datalist[[1]], titles[[1]])
myfunc2(datalist[[2]], titles[[2]])
myfunc2(datalist[[3]], titles[[3]])
길이가 같으면 (또는 길이 1) 각 인수가 참 list
(에서와 같이 datalist
)인지 벡터 (에서와 같이)인지는 실제로 중요하지 않습니다 titles
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다