假设我有一个包含 xy 值的数据集,它们根据两个变量分组:grpabc ,而 subgrpEFG

  • a 在 [0, 1]
  • 中有 y
  • b 在 [10, 11]
  • 中有 y
  • c 在 [100, 101] 中有 y 值。

  • 我想用 y 为所有 xy 组合定义的点的颜色,针对 grp 绘制 subgrp。由于每个 grp 具有非常不同的 y 值,我不能只使用 facet_grid ,因为色阶将毫无用处。所以,我用自己的比例绘制每个 grp ,然后用 plot_grid 中的 cowplot 将它们拼凑在一起。我还想使用 scale_colour_gradient2 指定的三点梯度。我的代码如下所示:

    # Set RNG seed
    set.seed(42)
    
    # Toy data frame
    df <- data.frame(x = runif(270), y = runif(270) + rep(c(0, 10, 100), each = 90),
                     grp = rep(letters[1:3], each = 90), subgrp = rep(LETTERS[4:6], 90))
    
    head(df)
    #>           x         y grp subgrp
    #> 1 0.9148060 0.1362958   a      D
    #> 2 0.9370754 0.7853494   a      E
    #> 3 0.2861395 0.4533034   a      F
    #> 4 0.8304476 0.1357424   a      D
    #> 5 0.6417455 0.8852210   a      E
    #> 6 0.5190959 0.3367135   a      F
    
    # Load libraries
    library(cowplot)
    library(ggplot2)
    library(dplyr)
    
    # Plotting list
    g_list <- list()
    
    # Loop through groups 'grp'
    for(i in levels(df$grp)){
      # Subset the data
      df_subset <- df %>% filter(grp == i)
    
      # Calculate the midpoint
      mp <- mean(df_subset$y)
    
      # Print midpoint
      message("Midpoint: ", mp)
    
      g <- ggplot(df_subset) + geom_point(aes(x = x, y = y, colour = y))
      g <- g + facet_grid(. ~ subgrp) + ggtitle(i)
      g <- g + scale_colour_gradient2(low = "blue", high = "red", mid = "yellow", midpoint = mp)
      g_list[[i]] <- g
    }
    #> Midpoint: 0.460748857570191
    #> Midpoint: 10.4696476330981
    #> Midpoint: 100.471083269571
    
    plot_grid(plotlist = g_list, ncol = 1)
    

    reprex package (v0.2.1) 于 2019-04-17 创建
    在此代码中,我将颜色渐变的中点指定为每个 ygrp 平均值。我打印这个并验证它是正确的。这是。
    我的问题:为什么前两个图的色阶不正确?
    尽管对数据进行了子集化,但似乎对每个 grp 应用了相同的范围。如果我用 for(i in levels(df$grp)){ 替换 for(i in levels(df$grp)[1]){ ,则生成的单个图的色标是正确的。

    更新
    好吧,这很奇怪。在 ggplot_build(g)$data[[1]]$colour 之前插入 g_list[[i]] <- g 可以解决问题。但为什么?
    r - 使用 cowplot 将绘图拼凑在一起时的颜色渐变不正确-LMLPHP

    最佳答案

    长话短说,您正在创建未评估的 promise ,然后在原始数据消失时评估它们。如果您使用正确的函数式编程风格而不是过程代码,通常可以避免这个问题。即,定义一个完成工作的函数,然后为循环使用一个应用函数。

    set.seed(42)
    
    # Toy data frame
    df <- data.frame(x = runif(270), y = runif(270) + rep(c(0, 10, 100), each = 90),
                     grp = rep(letters[1:3], each = 90), subgrp = rep(LETTERS[4:6], 90))
    
    library(cowplot)
    library(ggplot2)
    library(dplyr)
    
    # Loop through groups 'grp'
    g_list <- lapply(
      levels(df$grp),
      function(i) {
        # Subset the data
        df_subset <- df %>% filter(grp == i)
    
        # Calculate the midpoint
        mp <- mean(df_subset$y)
    
        # Print midpoint
        message("Midpoint: ", mp)
    
        g <- ggplot(df_subset) + geom_point(aes(x = x, y = y, colour = y))
        g <- g + facet_grid(. ~ subgrp) + ggtitle(i)
        g <- g + scale_colour_gradient2(low = "blue", high = "red", mid = "yellow", midpoint = mp)
        g
      }
    )
    #> Midpoint: 0.460748857570191
    #> Midpoint: 10.4696476330981
    #> Midpoint: 100.471083269571
    
    plot_grid(plotlist = g_list, ncol = 1)
    

    reprex package (v0.2.1) 于 2019-04-17 创建

    关于r - 使用 cowplot 将绘图拼凑在一起时的颜色渐变不正确,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55729296/

    10-12 16:49