r - 如何在ggplot2中分别缩放线和点的大小

标签 r ggplot2 scale layer

代码如下:

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)

结果是这样的:

enter image description here

点的大小太小,所以我想通过 scale_size 更改它的大小.但是,似乎线和点都受到了影响。所以我想知道是否有办法用单独的图例分别缩放线和点?

最佳答案

我能想到的两种方法是 1)结合两个传奇 grobs 或 2)破解另一个传奇美学。 @Mike Wise 在上面的评论中提到了这两个。

方法#1:使用 grobs 在同一个图中组合 2 个单独的图例。

我使用了 answer 中的代码捕获传奇。巴蒂斯特的 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,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)

printing 的注释: 使用 arrangeGrob()而不是 grid.arrange() .我不得不使用 png; grid.draw; dev.off保存(arrangeGrob)图。

grob_legends

方法#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,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)) )))

legend_hack

关于r - 如何在ggplot2中分别缩放线和点的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34893760/

相关文章:

r - 如何更改条形图 y 轴来表示其值?

r - 基于背景对比度的文本颜色

Android 将多边形保存为图像并设置 1 :10000 scale

r - 合并 data.frame 但只保留唯一的列?

r - 如何改变过滤后的行(使用 dplyr 或 if/else)

r - 索引向量中的连续重复项

r - 具有自由刻度但保持纵横比固定的刻面

css - 规模 :before when hovering

android - SurfaceView 的缩放动画

r - 如何从观察者修改reactiveValues列表元素的名称?