gpt4 book ai didi

r - 使用 cowplot 将绘图拼凑在一起时的颜色渐变不正确

转载 作者:行者123 更新时间:2023-12-01 03:07:00 24 4
gpt4 key购买 nike

假设我有一个数据集 xy根据两个变量分组的值:grpa , b , 或 c , 而 subgrpE , F , 或 G .

  • ay [0, 1] 中的值
  • by [10, 11] 中的值
  • cy [100, 101] 中的值。

  • 我想绘制 y反对 xy 定义的点的颜色所有 grpsubgrp组合。自各 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)

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

    更新
    好吧,这很奇怪。插入 ggplot_build(g)$data[[1]]$colour紧接在 g_list[[i]] <- g 之前解决了这个问题。但为什么?
    enter image description here

    最佳答案

    长话短说,您正在创建未评估的 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)



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

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

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com