[英]Density plots via Map with ggplot2
我在 R 中有一個 dataframe df
。(我們可以使用iris
的示例。)我也有 iris 的簡單轉換:
iris0 <- iris
iris1 <- cbind(log(iris[,1:4]),iris[5])
iris2 <- cbind(sqrt(iris[,1:4]),iris[5])
我想為這三個數據集創建一個列表 object,其中包含iris
中所有數值屬性的密度分布。 (因此,3 個數據集中的每個數據集總共有 4 個屬性:一個列表 object 中的 12 個密度圖。)我希望給定數據集(對於每個屬性)的密度都是單一顏色,即顏色應該完全取決於數據集。 僅使用基數 R,我認為 Map 是最好的方法:
datasets=c("iris0","iris1","iris2")
Map(function(.x, .y, df) {
ggplot(data = get(df), aes(x=.x)) +
geom_density(aes(fill=df)) + xlab(.y) + ggtitle(label=paste0(.y," Density in ",df," dataset"))}, df[names(df)], names(df), as.character(datasets) )
這似乎遇到了錯誤, Error in get(df): object 'df' not found
。 我還嘗試用get
around each df
包裝df[names(df)]
和names(df)
,但錯誤仍然存在。
我還可以看到其他潛在的問題——我不確定fill=df
是否會將數據幀正確編碼為一個因素,並確保它們每個都是單獨的唯一顏色(但每個屬性的所有屬性都保持相同的顏色) .
任何人都可以幫助解決這個問題嗎?
(除了 base R + ggplot2 和潛在的 dplyr 之外,我想不使用任何包來做到這一點)
我沒有使用lapply
,而是使用Map
首先遍歷datasets
,然后通過names(get(df))[1:4]
遍歷變量。最后,我使用Reduce
展平列表列表。 我還添加了一個自定義調色板來按數據集填充密度圖。 試試這個:
iris0 <- iris
iris1 <- cbind(log(iris[,1:4]),iris[5])
iris2 <- cbind(sqrt(iris[,1:4]),iris[5])
datasets <- c("iris0","iris1","iris2")
palfill <- c("iris0" = "red","iris1" = "green","iris2" = "blue")
library(ggplot2)
# list of lists
plots <- lapply(datasets, function(df) {
lapply(names(get(df))[1:4], function(.x) {
ggplot(data = get(df), aes_string(x = .x)) +
geom_density(aes(fill = df)) +
scale_fill_manual(values = palfill) +
xlab(.x) +
ggtitle(label = paste0(.x, " Density in ", df," dataset"))
})
})
# flatten
plots <- Reduce(c, plots)
plots[[1]]
由reprex package (v0.3.0) 創建於 2020-05-16
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.