使用scale_size_area(ggplot2)将大小为“0”的点绘制为完全缺失的点

6
我想制作一个条件气泡图,根据簇绘制,每个气泡的大小由第三个“percent”变量设置。根据ggplot2文档,我认为我应该能够通过scale_size_area实现这一点。我不清楚为什么这不起作用,当percent=0时我仍然看到非常小的点。(如果我误解了,我也希望能得到解决方案。在我的真实数据中,区分0和非常接近0非常重要。)
ex <- data.frame(Condition=rep(c("ex1","ex2","ex3","ex4"),4),
                 Cluster=c(rep(1,4),rep(2,4),rep(3,4),rep(4,4)),
             Percent=c(0,0,0,1,0.25,0,0.25,0.5,1,0,0,0,0.25,0.25,0.25,0.25))
ggplot(ex, aes(Cluster, Condition, size=Percent))+ 
           geom_point(color = "blue")+ scale_size_area(max_size=20)

example plot


2
你是否考虑过使用 ifelse(Percent==0, NA, Percent) 代替 size=Percent - lukeA
2
可能与“描边”(点的轮廓)有关。尽管我的印象是只有21到25号点有轮廓,但在geom_point中使用stroke = 0会在Percent为0时删除这些点。 - aosmith
@lukeA 那个方法可行!如果你想把它作为答案发布,我很乐意接受。 - blep
2个回答

11

试一试

library(ggplot2)
ex <- data.frame(Condition=rep(c("ex1","ex2","ex3","ex4"),4),
                 Cluster=c(rep(1,4),rep(2,4),rep(3,4),rep(4,4)),
             Percent=c(0,0,0,1,0.25,0,0.25,0.5,1,0,0,0,0.25,0.25,0.25,0.25))
ggplot(ex, aes(Cluster, Condition, size=ifelse(Percent==0, NA, Percent))))+ 
           geom_point(color = "blue")+ scale_size_area(max_size=20)

使用size=ifelse(Percent==0, NA, Percent))而不是size=Percent将排除这些点的绘制。


这是一个近似的解决方法,但 ggplot 仍将值零解释为非零圆圈,因此其他大小值仍然在其大小上略有不准确。这个解决方法可能足够接近,以至于人眼无法区分错误,但它实际上并没有解决问题。 - Ben

1
您可以尝试以下方法,使用data.table:

您也可以尝试以下方法,使用data.table:

library(data.table)
ex2<-as.data.table(ex)
ggplot(ex2, aes(Cluster, Condition))+ 
geom_point(data=ex2[ex2$Percent > 0],aes(size=Percent), color = "blue")+scale_size_area(max_size=20)

在这里,您只需在geom_point中创建一个新框架,排除所有百分比等于0的行。 以前的方法存在问题:如果您的所有行百分比都为零,那么...

Percent=c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)

您会收到一个错误

grid.Call.graphics(C_setviewport, vp, TRUE) 错误:视口的大小和/或位置不是无限的。

如果您使用数据表方法(或任何其他只向ggplot提供要绘制的信息的方法),则不会有任何问题,并且您将获得一个空图,这在自动化脚本的情况下要比崩溃好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接