我可以将以下图形生成为两个图形,但无法弄清楚如何将它们组合成一个图形,其中的条形图要比“地毯”上的密度要大。
bars <- data.frame( start=c(1,34,67,98), stop=c(34,67,98,125), label=c(1,2,1,3) )
points <- data.frame( x=c(16,29,37,52,58,68,77,89,103,114) )
ggplot(bars, aes(xmin = start, xmax = stop, ymin=label-1, ymax=label, fill=label)) + geom_rect()
ggplot(data=points, aes(x=x)) + geom_density() + geom_rug()
我尝试过类似的事情:
ggplot(bars, aes(xmin = start, xmax = stop, ymin=label-1, ymax=label, fill=label)) +
geom_rect() +
geom_density(data=points, aes(x=x)) +
geom_rug(data=points, aes(x=x))
但是似乎后面的geom_X调用弄乱了第一个调用:
FUN(X [[i]],...)中的错误:找不到对象'label'
答案 0 :(得分:2)
在图的每个部分中,都有不同的变量映射到 x 和 y 。因此,您必须从原始的aes()
调用中抽出ggplot()
规范(这使其适用于所有几何),而应为每个几何指定不同的名称。然后,您必须指定每个geom
应该使用哪些数据。像这样:
ggplot(bars) +
geom_density(data = points, aes(x = x, y = stat(scaled))) +
geom_rug(data = points, aes(x = x)) +
# Will use the default bars data
geom_rect(aes(xmin = start, xmax = stop, ymin=label-1, ymax=label, fill=label))
答案 1 :(得分:0)
有帮助吗?
ggplot(bars, aes(xmin = start, xmax = stop, ymin=label-1, ymax=label, fill=label)) +
geom_rect()+
geom_rug(data=points, aes(x=x),inherit.aes = F)+
geom_density(data=points,aes(x=x,y=stat(scaled)),inherit.aes = F)
#need a y argument in geom_density.
#This is from @Marius' answer. Aim is to show inherit.aes usage
答案 2 :(得分:0)
这项工作将会完成
bars <- data.frame( start=c(1,34,67,98), stop=c(34,67,98,125), label=c(1,2,1,3) )
points <- data.frame( x=c(16,29,37,52,58,68,77,89,103,114) )
points2<- data.frame(x=density(points$x)$x,y= density(points$x)$y * max(bars$label)*100)
ggplot()+ geom_rect(data = bars, aes(xmin = start, xmax = stop, ymin=label-1, ymax=label, fill=label)) +
geom_line(data = points2,aes(x=x,y=y))