首页 > 解决方案 > 使用 ggplot2/ggpubr 绘图时在变量(列)上使用函数

问题描述

通常,当您想绘制一个变量与另一个变量时,您只需提供变量名称,这很酷。如果您想要的变量是计算的结果,您可以将其作为列添加到 data.frame 或 data.table 中,然后使用它。但是,如果您有大数据框并且只需要绘制这些新列一次,这会产生大量垃圾/冗余数据。所以我本质上是想找到一种方法来使用变量上的函数。

我将尝试用一个例子来说明这一点:

data(iris)
ggboxplot(iris, x="Species", y="Sepal.Width", add = "jitter")

在此处输入图像描述

将为不同种类的鸢尾花绘制萼片宽度。但是,如果您想对变量使用自定义函数,例如:

ggboxplot(iris, x=round("Sepal.Length"), y="Sepal.Width", add = "jitter")
Error in round("Sepal.Length") : 
  non-numeric argument to mathematical function

这是有道理的,因为函数不知道引号中的文本是指一个变量。

请注意,我一直在使用该ggpubr软件包来绘制更漂亮的图,但我认为问题本质上更进一步ggplot2

ggplot(data = iris, aes(x=floor(Sepal.Length), y=Sepal.Width)) + geom_boxplot()
Warning message:
Continuous x aesthetic -- did you forget aes(group=...)? 

在此处输入图像描述

绕过它的一种方法是覆盖 aes 映射,但这会导致 x 轴有点奇怪

ggplot(data = iris, aes(y=Sepal.Width, x=Sepal.Length)) + geom_boxplot(mapping = aes(group=floor(Sepal.Length)))

在此处输入图像描述

我认为必须有一种更简单的方法来完成这项工作,有什么建议吗?理想情况下,我希望继续使用ggboxplot()from ggpubrpackage,但如果不能在那里完成,我可以考虑ggplot2单独使用。

标签: rggplot2ggpubr

解决方案


为了继续使用 ggboxplot() 函数,一个可能的解决方案是围绕它创建一个包装自定义函数,如下所示:

 libray(ggpubr)
 ggboxplot2 <- function(data, x, y, ...){
    data[[y]] <- floor(data[[y]])
    ggpubr::ggboxplot(data, x, y, ...)
 }

使用自定义函数创建箱线图:

ggboxplot2(iris, x = "Species", y = "Sepal.Width", add = "jitter")

推荐阅读