使用ggplot2通过地图绘制密度图。

问题描述 投票:0回答:1

我有一个数据框架 df 的例子(我们可以以 iris.) 我还有虹膜的简单变换。

iris0 <- iris
iris1 <- cbind(log(iris[,1:4]),iris[5])
iris2 <- cbind(sqrt(iris[,1:4]),iris[5])

我想创建一个列表对象,其中包含了所有数字属性的密度分布。iris,为这三个数据集中的每一个。所以,3个数据集中每个数据集共有4个属性:一个列表对象中有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. 我还试着把 df[names(df)]names(df)get 围绕 df但错误依然存在。

我还可以看到其他潜在的问题--我不确定。fill=df 将正确地将数据帧编码为一个因子,并确保它们每个都是一个独立的唯一颜色(但每个都保持所有属性的相同颜色)。

谁能帮忙解决这个问题?

(我想在不使用任何包的情况下,除了基础R+ggplot2和可能的dplyr外,还可以做到这一点)

r ggplot2
1个回答
1
投票

而不是使用 Map 我利用的是 lapply 遍历 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]]

创建于2020-05-16,作者: 重读包 (v0.3.0)

© www.soinside.com 2019 - 2024. All rights reserved.