[英]How to scale the size of line and point separately in ggplot2
代码如下:
set.seed(123)
d1=data.frame(x=runif(10),y=runif(10),z=runif(10,1,10))
d2=data.frame(x=runif(10),y=runif(10),z=runif(10,100,1000))
ggplot()+geom_point(aes(x,y,size=z),data=d1)+
geom_line(aes(x,y,size=z),data=d2)
结果是这样的:
点的大小太小,所以我想通过scale_size
改变它的大小。 然而,似乎线条和点都受到影响。 所以我想知道是否有办法用单独的图例分别缩放线条和点?
我能想到的两种方式是:1)结合两个传说中的凹凸或2)破坏另一个传奇美学。 这些都是由@Mike Wise在上面的评论中提到的。
方法#1:使用grobs在同一个图中组合2个单独的图例。
我使用这个答案中的代码来抓住传奇。 巴普蒂斯特的编辑格罗布小插图是一个有用的参考。
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,y,size=z),data=d1) + scale_size(name = "point")
p2 <- ggplot()+ geom_line(aes(x,y,size=z),data=d2) + scale_size(name = "line")
p3 <- ggplot()+ geom_line(aes(x,y,size=z),data=d2) +
geom_point(aes(x,y, 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)
打印注意事项:使用arrangeGrob()
而不是grid.arrange()
。 我不得不用png; grid.draw; dev.off
png; grid.draw; dev.off
png; grid.draw; dev.off
保存(arrangeGrob)图。
方法#2:攻击另一个美学传奇。
MilanoR有一个很棒的帖子,专注于颜色而不是尺寸。 更多SO示例:1) 离散颜色和2) 颜色渐变 。
#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,y,size=z),data=d2) +
geom_point(aes(x,y, size=z * 100, fill = as.character(z.bin)),data=d1) +
scale_size("line", range = c(1,5)) +
scale_fill_manual("points", values = rep(1, 10) ,
guide = guide_legend(override.aes =
list(colour = "black",
size = sort(unique(d1$z.bin)) )))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.