【问题标题】:Changing size of legend and point shapes in plot from CGPfunctions::Plot2WayANOVA with GGplot2 in R使用 R 中的 GGplot2 从 CGPfunctions::Plot2WayANOVA 更改图例和点形状的大小
【发布时间】:2021-03-26 10:21:48
【问题描述】:

我想调整图例大小,以便您可以看到图例中不同类型的线,并更改点的形状,以便每个 cyl 组有不同的点形状。

Plot2WayANOVA 函数有一个用于传递 ggplot2 参数的参数,但它可能只是用于更改主题的组件?此外,还有一个保存绘图的选项,但它会将其保存为 png,当我将绘图指定为对象并打印时,只会显示文本。

library(CGPfunctions)

Plot2WayANOVA(formula = mpg ~ am * cyl, dataframe = mtcars)

更新:运行以下数据时出现错误。

d <- structure(list(Wave = c(1, 2, 3, 4, 3, 1, 2, 3, 4, 1, 2, 3, 4, 
1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 
2, 3, 4, 1, 2, 3, 1, 2, 3, 4, 3, 4, 1, 3, 4, 1, 2, 3, 4, 1, 2, 
3, 4, 1, 3, 4, 1, 2, 3, 4, 1, 4, 1, 1, 2, 3, 1, 2, 3, 4, 1, 2, 
3, 1, 1, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 2, 4, 1, 2, 3, 4, 1, 2, 
3, 4, 1), CigAd = c(1, 0, 4, 1, 15, 8, 4, 1, 2, 36, 17, 14, 16, 
21, 16, 34, 29, 30, 17, 32, 24, 23, 5, 15, 17, 26, 26, 29, 12, 
22, 30, 30, 37, 25, 0, 25, 22, 22, 22, 30, 21, 29, 36, 37, 14, 
23, 0, 0, 0, 0, 0, 0, 0, 0, 17, 15, 34, 0, 0, 0, 13, 15, 24, 
19, 18, 25, 40, 4, 0, 3, 1, 0, 0, 10, 18, 16, 18, 29, 1, 15, 
14, 30, 21, 22, 27, 26, 28, 28, 24, 4, 5, 0, 0, 5, 0, 9, 4, 17, 
16, 26), storetype = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 2L, 2L, 
2L, 2L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L), .Label = c("1", 
"2", "3"), class = "factor")), row.names = c(NA, 100L), class = "data.frame")

谢谢!

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    这里的问题是Plot2WayANOVA 是一个围绕ggplot 的包装函数,它试图通过处理创建适当的ggplot 以可视化数据的许多技术方面来更容易地绘制您的方差分析。虽然这种功能对学习者或数据的快速可视化很有帮助,但它并不适合按照您的方式自定义绘图。

    执行您要求的所有事情的选项不存在于函数本身中。您可以传递额外的geom 调用和scale 调用以及theme 调用,但困难在于未映射点的形状美学。 可以添加一个 theme 来扩大图例键,但是当你这样做时,你会发现错误线也包含在图例中,作为覆盖厚图案的细线行,看起来很乱,又不能通过函数参数改变。

    因此,您有两个选择:

    1. 直接使用ggplot 自己构建情节:这样做的问题是,将所有相关的模型摘要信息都放入标题下方的标题中会很痛苦,当然这会失去意义首先拥有Plot2WayANOVA
    2. 修改Plot2WayANOVA返回的绘图对象:问题在于Plot2WayANOVA实际上并没有返回一个ggplot对象;它只打印 ggplot,然后返回一个很好的关于分析的信息的大列表。您需要破解该函数以使其返回一个 ggplot 对象。

    我将在这里演示您将如何使用第二种方法。与从头开始构建相比,它需要的代码更少,但技术性更强,更难遵循。

    首先,编写一个新版本的Plot2WayANOVA,它返回一个ggplot而不是摘要对象:

    f <- CGPfunctions::Plot2WayANOVA
    body(f)[[84]] <- quote(return(p))
    My_Plot2WayANOVA <- f
    

    所以现在我们可以通过以下方式获取我们的 ggplot 对象:

    p <- My_Plot2WayANOVA(formula = mpg ~ am * cyl, dataframe = mtcars)
    

    我们需要修改美学映射以使其行为符合我们的要求,并覆盖 geom_errorbar 以确保它具有空白键字形:

    p$layers[[3]]$aes_params$shape   <- NULL
    p$layers[[3]]$aes_params$colour  <- NULL
    p$layers[[3]]$geom_params$colour <- NULL
    p$layers[[3]]$geom_params$shape  <- NULL
    p$layers[[3]]$mapping            <- aes(color = cyl, fill = cyl)
    p$mapping                        <- aes(colour = cyl, shape = cyl, 
                                            fill = cyl, group = cyl,
                                            x = am, y = TheMean)
    
    p$layers[[1]] <- geom_errorbar(aes(ymin = LowerBound, ymax = UpperBound), 
                                   size = 1, width = 0.1, key_glyph = "blank")
    

    现在p 是一个 ggplot 对象,您可以在其中添加您认为合适的自定义比例和主题:

    p + scale_shape_manual(values = c(21:23), name = "cyl") +
        theme(legend.key.width = unit(75, "points"))
    

    是否值得为所有这些麻烦而努力是值得商榷的;如果您真的发现原始样式不可接受,那么从头开始自己构建情节可能会更容易、更安全。


    编辑

    这是一个将数据添加到问题中的工作示例:

    p <- My_Plot2WayANOVA(formula = CigAd ~ Wave * storetype, dataframe = d)
    
    p$layers[[3]]$aes_params$shape   <- NULL
    p$layers[[3]]$aes_params$colour  <- NULL
    p$layers[[3]]$geom_params$colour <- NULL
    p$layers[[3]]$geom_params$shape  <- NULL
    p$layers[[3]]$mapping <- aes(color = storetype, fill = storetype)
    p$mapping <- aes(colour = storetype, shape = storetype, 
                     fill = storetype, group = storetype,
                     x = Wave, y = TheMean)
    p$layers[[1]] <- geom_errorbar(aes(ymin = LowerBound, ymax = UpperBound), 
                                   size = 1, width = 0.1, key_glyph = "blank")
    
    p + scale_shape_manual(values = c(21:23), name = "storetype") +
        theme(legend.key.width = unit(75, "points"))
    

    【讨论】:

    • 它适用于我的示例数据,但是当我尝试使用我的实际数据运行时,它给了我一个错误。 FUN(X[[i]], ...) 中的错误:找不到对象“我”
    • 我将尝试使用一些示例数据来重现该问题。
    • 我添加了一个出现错误的数据示例。感谢您的帮助!
    • 哦,我明白了,我没有注意到 geom_errorbar 是特定于数据的,DUH。谢谢!
    猜你喜欢
    • 2016-03-13
    • 1970-01-01
    • 2012-09-23
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 2016-03-20
    相关资源
    最近更新 更多