上一篇文章介绍了如何在ggplot中超过给定值的点周围绘制红色圆圈。对于异常检测结果,我想做同样的事情,但是要在属于给定因子水平的点周围绘制圆圈。
如何更改此代码以允许在给定的因子水平周围绘制圆?
ggplot(mtcars, aes(wt, mpg)) +
geom_point() +
geom_point(data=mtcars[mtcars$mpg>30,],
pch=21, fill=NA, size=4, colour="red", stroke=1) +
theme_bw()
答案 0 :(得分:2)
您需要做的是先绘制所有点,然后仅绘制圆圈以将数据缩小到要突出显示的因子水平。这样可以解决您的问题吗?
ggplot() +
geom_point(data=iris, aes(Sepal.Length, Sepal.Width)) +
geom_point(data=iris[iris$Species %in% c("setosa"),], aes(Sepal.Length, Sepal.Width),
pch=21, fill=NA, size=4, colour="red", stroke=1) +
theme_bw()
请注意,我更改了数据集,因为我需要数据中的一个要素来向您展示其工作原理。
答案 1 :(得分:1)
让我们假设您感兴趣的“因子水平”是10.4
的值mtcars$mpg
。 mtcars$mpg
是一个数值向量,因此您首先必须将其转换为因子。
mtcars$mpg <- as.factor(mtcars$mpg)
然后,您可以使用先前用于大于限制的值的相同代码,只是这次条件属于因子级别10.4
:
ggplot(mtcars, aes(wt, mpg)) +
geom_point() +
geom_point(data=mtcars[mtcars$mpg %in% 10.4, ],
pch=21, fill=NA, size=4, colour="red", stroke=1) +
theme_bw()
请注意,mtcars$mpg
到因数的转换不是必需的,并且代码将以相同的方式在数值向量上运行。因为您的问题是关于“因子水平”的,所以我将其转换。
还请注意,如果您不处理因子水平,而只是处理与某个数字匹配的值,则可以使用:
ggplot(mtcars, aes(wt, mpg)) +
geom_point() +
geom_point(data=mtcars[mtcars$mpg == 10.4, ],
pch=21, fill=NA, size=4, colour="red", stroke=1) +
theme_bw()
因为您现在仅在测试是否平等,而不是在外观上。
答案 2 :(得分:0)
我最近尝试使用上述方法来突出显示具有分解轴的点的子集。不幸的是,第二个子集geom_point
的调用似乎对轴进行了重新排序。通过使用gghighlight包,我可以避免此问题。
ggplot(mtcars, aes(x = cyl, y = mpg, color = as.factor(carb))) +
geom_point() +
gghighlight(carb == 2, use_direct_label = FALSE, unhighlighted_colour = NULL) +
geom_point(pch=21, fill=NA, size=4, colour="black", stroke=0.5)