我是R的新手,想要在现有情节上绘制特定点。我正在使用swiss
数据框,我通过plot(swiss)
函数可视化。
在此之后,想要添加Mahalanobis距离给出的异常值:
mu_hat <- apply(swiss, 2, mean); sigma_hat <- cov(swiss)
mahalanobis_distance <- mahalanobis(swiss, mu_hat, sigma_hat)
outliers <- swiss[names(mahalanobis_distance[mahalanobis_distance > 10]),]
points(outliers, pch = 'x', col = 'red')
但是这最后一行没有效果,因为离群点不会添加到上一个图中。我看到如果对一对变量重复这个过程,比如说
plot(swiss[2:3])
points(outliers[2:3], pch = 'x', col = 'red')
答案 0 :(得分:2)
这是使用GGally::ggpairs
的解决方案。它有点难看,因为我们需要修改ggally_points
函数来指定所需的颜色方案。
我认为mu_hat = colMeans(swiss)
和sigma_hat = cov(swiss)
。
library(dplyr)
library(GGally)
swiss %>%
bind_cols(distance = mahalanobis(swiss, colMeans(swiss), cov(swiss))) %>%
mutate(is_outlier = ifelse(distance > 10, "yes", "no")) %>%
ggpairs(columns = 1:6,
mapping = aes(color = is_outlier),
upper = list(continuous = function(data, mapping, ...) {
ggally_points(data = data, mapping = mapping) +
scale_colour_manual(values = c("black", "red"))
}),
lower = list(continuous = function(data, mapping, ...) {
ggally_points(data = data, mapping = mapping) +
scale_colour_manual(values = c("black", "red"))
}),
axisLabels = "internal")
答案 1 :(得分:-1)
不幸的是,你现在正在做的事情是不可能的。在绘制数据框时,R会生成许多图并对齐它们。您实际看到的是6乘6 = 36个单独的地块,它们都已经对齐,看起来不错。
当您使用dots
命令时,它会告诉它将点放在当前图上。当你有36个情节时,这真的没有意义,至少不是你想要它的方式。
ggplot
是R中非常强大的工具,它提供了更强的可燃性。例如,您可以设置数据框以包含您的异常值,但将它们标记为“异常值”并将其放置在您已设置为构面的每个图中。您探索的越多,您可能会发现有更好的情节也适合您的需求。
在基础R中绘制数据框是一个很好的探索工具。您可以将这些异常值设置为单独的数据帧并绘制它,以便您可以并排查看每个6乘6的图并进行比较。这一切都取决于你的目标。如果您的目标是按照您的描述完全生产,ggplot2
包将帮助您创建更专业的东西。正如@Gregor在评论中建议的那样,从ggpairs
包中查找函数GGally
将是一个很好的起点。