annotate()
ggplot 中的函数允许您将几何图形添加到具有“不是从数据框的变量映射,而是作为矢量”的属性的图中,这意味着您可以添加与数据框无关的图层。在这种情况下,您的两条密度曲线与数据框相关(因为变量在其中),但是因为您试图以不同的方式定位它们,所以 usingannotate()
很有用。
这是一种解决方法:
data("kyphosis", package="rpart")
model.only <- ggplot(data=kyphosis, aes(x=Age, y = as.numeric(Kyphosis) - 1)) +
stat_smooth(method="glm", family="binomial")
absents <- subset(kyphosis, Kyphosis=="absent")
presents <- subset(kyphosis, Kyphosis=="present")
dens.absents <- density(absents$Age)
dens.presents <- density(presents$Age)
scaling.factor <- 10 # Make the density plots taller
model.only + annotate("line", x=dens.absents$x, y=dens.absents$y*scaling.factor) +
annotate("line", x=dens.presents$x, y=dens.presents$y*scaling.factor + 1)
这为每个后凸组添加了两个带有比例密度图的注释层。对于presents
变量,y
按比例缩放并增加 1 以将其向上移动。
您还可以填充密度图,而不仅仅是使用一条线。而不是annotate("line"...)
你需要使用annotate("polygon"...)
,像这样:
model.only + annotate("polygon", x=dens.absents$x, y=dens.absents$y*scaling.factor, fill="red", colour="black", alpha=0.4) +
annotate("polygon", x=dens.presents$x, y=dens.presents$y*scaling.factor + 1, fill="green", colour="black", alpha=0.4)
从技术上讲,您可以使用,但是当您将情节上annotate("density"...)
移一个时,这将不起作用。present
它没有移动,而是填充了整个情节:
model.only + annotate("density", x=dens.absents$x, y=dens.absents$y*scaling.factor, fill="red") +
annotate("density", x=dens.presents$x, y=dens.presents$y*scaling.factor + 1, fill="green")
解决该问题的唯一方法是使用多边形而不是密度几何。
最后一个变体:沿 y 轴 = 1 翻转顶部密度图:
model.only + annotate("polygon", x=dens.absents$x, y=dens.absents$y*scaling.factor, fill="red", colour="black", alpha=0.4) +
annotate("polygon", x=dens.presents$x, y=(1 - dens.presents$y*scaling.factor), fill="green", colour="black", alpha=0.4)