向 ggpairs() 散点图添加文本?
Add text to a ggpairs() scatterplot?
愚蠢但令人抓狂的问题:如何向 ggpairs(...)
图中的 点 散点图添加文本标签? ggpairs(...)
来自 GGally
图书馆。正常的 geom_text(...)
函数似乎不是一个选项,因为它接受 x,y 参数并且 ggpairs
创建一个 NxN 矩阵的不同样式的图。
未显示数据,但假设我有一个名为“ID”的列,其中包含散点图中显示的每个点的 ID。
如果有帮助,很高兴添加数据,但不确定是否有必要。也许答案很简单,无法将文本标签添加到 ggpairs(...)
?
library(ggplot2)
library(GGally)
ggpairs(hwWrld[, c(2,6,4)], method = "pearson")
注:添加标签仅供个人参考。所以没必要告诉我它看起来一团糟。它会。我只是想找出我的异常值。
谢谢!
这当然是可能的。查看 ?GGally::ggpairs
的文档,有三个参数,upper
、lower
和 diag
,从文档的详细信息来看是
Upper and lower are lists that may contain the variables 'continuous', 'combo', 'discrete' and 'na'. Each element of thhe list may be a function or a string
... (more description)
If a function is supplied as an option to upper, lower, or diag, it should implement the function api of function(data, mapping, ...){#make ggplot2 plot}
. If a specific function needs its parameters set, wrap(fn, param1 = val1, param2 = val2)
the function with its parameters.
因此,“制作标签”的一种方法是覆盖绘图的默认值。例如,如果我们想在上面的三角形中写“hello world”,我们可以这样做:
library(ggplot2)
library(GGally)
#' Plot continuous upper function, by adding text to the standard plot
#' text is placed straight in the middle, over anything already residing there!
continuous_upper_plot <- function(data, mapping, text, ...){
p <- ggally_cor(data, mapping, ...)
if(!is.data.frame(text))
text <- data.frame(text = text)
lims <- layer_scales(p)
p + geom_label(data = text, aes(x = mean(lims$x$range$range),
y = mean(lims$y$range$range),
label = text),
inherit.aes = FALSE)
}
ggpairs(iris, upper = list(continuous = wrap(continuous_upper_plot,
text = 'hello world')))
最终结果是:
这里有3点需要注意:
- 我决定在函数本身中添加文本。如果您的文本是现有数据的一部分,只需在调用函数时使用
mapping
(aes
) 参数就足够了。这可能也更好,因为您希望向特定点添加文本。
- 如果您有任何额外的函数参数(在
data
和 mapping
之外),您将需要使用 wrap
将它们添加到调用中。
- 函数文档特别指出参数应该是
data, mapping
而不是 ggplot2
的标准 mapping, data
。因此,对于任何 ggplot 函数,需要一个小的包装器来切换它们的位置,以覆盖 ggpairs
. 的默认参数
愚蠢但令人抓狂的问题:如何向 ggpairs(...)
图中的 点 散点图添加文本标签? ggpairs(...)
来自 GGally
图书馆。正常的 geom_text(...)
函数似乎不是一个选项,因为它接受 x,y 参数并且 ggpairs
创建一个 NxN 矩阵的不同样式的图。
未显示数据,但假设我有一个名为“ID”的列,其中包含散点图中显示的每个点的 ID。
如果有帮助,很高兴添加数据,但不确定是否有必要。也许答案很简单,无法将文本标签添加到 ggpairs(...)
?
library(ggplot2)
library(GGally)
ggpairs(hwWrld[, c(2,6,4)], method = "pearson")
注:添加标签仅供个人参考。所以没必要告诉我它看起来一团糟。它会。我只是想找出我的异常值。
谢谢!
这当然是可能的。查看 ?GGally::ggpairs
的文档,有三个参数,upper
、lower
和 diag
,从文档的详细信息来看是
Upper and lower are lists that may contain the variables 'continuous', 'combo', 'discrete' and 'na'. Each element of thhe list may be a function or a string
... (more description)
If a function is supplied as an option to upper, lower, or diag, it should implement the function api of
function(data, mapping, ...){#make ggplot2 plot}
. If a specific function needs its parameters set,wrap(fn, param1 = val1, param2 = val2)
the function with its parameters.
因此,“制作标签”的一种方法是覆盖绘图的默认值。例如,如果我们想在上面的三角形中写“hello world”,我们可以这样做:
library(ggplot2)
library(GGally)
#' Plot continuous upper function, by adding text to the standard plot
#' text is placed straight in the middle, over anything already residing there!
continuous_upper_plot <- function(data, mapping, text, ...){
p <- ggally_cor(data, mapping, ...)
if(!is.data.frame(text))
text <- data.frame(text = text)
lims <- layer_scales(p)
p + geom_label(data = text, aes(x = mean(lims$x$range$range),
y = mean(lims$y$range$range),
label = text),
inherit.aes = FALSE)
}
ggpairs(iris, upper = list(continuous = wrap(continuous_upper_plot,
text = 'hello world')))
最终结果是:
这里有3点需要注意:
- 我决定在函数本身中添加文本。如果您的文本是现有数据的一部分,只需在调用函数时使用
mapping
(aes
) 参数就足够了。这可能也更好,因为您希望向特定点添加文本。 - 如果您有任何额外的函数参数(在
data
和mapping
之外),您将需要使用wrap
将它们添加到调用中。 - 函数文档特别指出参数应该是
data, mapping
而不是ggplot2
的标准mapping, data
。因此,对于任何 ggplot 函数,需要一个小的包装器来切换它们的位置,以覆盖ggpairs
. 的默认参数