簡體   English   中英

密度圖通過 Map 和 ggplot2

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM