【问题标题】:Density plots via Map with ggplot2使用 ggplot2 通过 Map 绘制密度图
【发布时间】:2020-05-15 22:38:36
【问题描述】:

我在 R 中有一个数据框 df。(我们可以使用 iris 的示例。)我也有简单的 iris 转换:

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

我想为这三个数据集中的每一个创建一个列表对象,其中包含iris 中所有数字属性的密度分布。 (因此,3 个数据集的每一个共有 4 个属性:一个列表对象中有 12 个密度图。)我希望给定数据集(每个属性)的密度都是单一颜色,即颜色应该完全取决于数据集。仅使用 base 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】:

    我没有使用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]]
    

    reprex package (v0.3.0) 于 2020-05-16 创建

    【讨论】:

    • 谢谢。完美运行(虽然我没有问,但很容易扩展到具有不同数量的数字列的数据集)。我想知道,有没有办法在不指定palfill &lt;- c("iris0" = "red","iris1" = "green","iris2" = "blue") 的情况下做颜色。所以我可以使用一个不错的 R 调色板(而不是我自己糟糕的创意选择),也不必指定数据集的确切长度
    • 我尝试将 scale_fill_manual(values = palfill) 替换为 scale_fill_brewer(palette = "Spectral") 但它只会导致每个图都具有相同的颜色
    • 当然。试试palfill &lt;- setNames(brewer.pal(length(datasets), "Spectral"), datasets)
    • 完美!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-10-15
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 2015-06-16
    • 2014-02-02
    相关资源
    最近更新 更多