代码如下:
set.seed(123) d1=data.frame(x=runif(10),y=runif(10),z=runif(10,1,10)) d2=data.frame(x=runif(10),100,1000)) ggplot()+geom_point(aes(x,y,size=z),data=d1)+ geom_line(aes(x,data=d2)
结果是这样的:
点的大小太小,所以我想通过scale_size来改变它的大小.但是,似乎线和点都受到影响.所以我想知道是否有一种方法可以分开使用单独的图例来缩放线条和点数?
解决方法
我可以想到的两种方式是1)组合两个传奇树丛,或2)黑客另一个传奇美学.这两个都是在@Mike Wise在上面的评论中提到的.
方法#1:在同一个情节中使用格子组合两个单独的传说.
我用这个answer的代码来抓住传说. Baptiste的arrangeGrob vignette是一个有用的参考.
library(grid); library(gridExtra) #Function to extract legend grob g_legend <- function(a.gplot){ tmp <- ggplot_gtable(ggplot_build(a.gplot)) leg <- which(sapply(tmp$grobs,function(x) x$name) == "guide-Box") legend <- tmp$grobs[[leg]] legend } #Create plots p1 <- ggplot()+ geom_point(aes(x,data=d1) + scale_size(name = "point") p2 <- ggplot()+ geom_line(aes(x,data=d2) + scale_size(name = "line") p3 <- ggplot()+ geom_line(aes(x,data=d2) + geom_point(aes(x,size=z * 100),data=d1) # Combined plot legend1 <- g_legend(p1) legend2 <- g_legend(p2) legend.width <- sum(legend2$width) gplot <- grid.arrange(p3 +theme(legend.position = "none"),legend1,legend2,ncol = 2,nrow = 2,layout_matrix = rbind(c(1,2 ),c(1,3 )),widths = unit.c(unit(1,"npc") - legend.width,legend.width)) grid.draw(gplot)
注意printing:使用arrangeGrob()而不是grid.arrange().我不得不用png; grid.draw; dev.off保存(arrangeGrob)图.
方法#2:黑客另一个美学传奇.
MilanoR有一个很好的帖子,专注于颜色而不是大小.
更多例子:1)discrete colour和2)colour gradient.
#Create discrete levels for point sizes (because points will be mapped to fill) d1$z.bin <- findInterval(d1$z,c(0,2,4,6,8,10),all.inside= TRUE) #Create bins #Scale the points to the same size as the lines (points * 100). #Map points to a dummy aesthetic (fill) #Hack the fill properties. ggplot()+ geom_line(aes(x,data=d2) + geom_point(aes(x,size=z * 100,fill = as.character(z.bin)),data=d1) + scale_size("line",range = c(1,5)) + scale_fill_manual("points",values = rep(1,guide = guide_legend(override.aes = list(colour = "black",size = sort(unique(d1$z.bin)) )))