在ggplot2之上叠加基础R图形

时间:2015-09-14 23:18:18

标签: r ggplot2 legend legend-properties

我在ggplot中有一个情节,我希望覆盖我用基本R代码创建的地图图例。我不知道如何将基础R图形覆盖在ggplot之上,并且非常感谢您的帮助。

目前我有一个ggplot图例,如下所示:enter image description here

对于我想改变的这个传奇,有几件我不喜欢的东西(这导致我认为使用基础R图形更容易这样做)。

特别是,我希望消除图例中框之间的空白区域,并希望在框之间添加刻度线。我也想把" 5"在第一个刻度线下方分隔第一个和第二个盒子; " 10"分隔第二和第三个方框的刻度线下面;和" 20"分隔第三个和第四个方框的刻度线下方。我还希望将图例中的方框与其中一个" bins"在我的情节中(我使用stat_bin2d图层)。

相关代码:

ggplot()+
stat_bin2d(restaurants.df,binwidth=c(1500,2500), alpha=0.6,aes(x=X,y=Y,fill=cut(..count.., c(0,5,10,20,Inf))))+
scale_fill_manual("No. of Restaurants",labels=c("<5","5-10","10-20",">20"),values=cols, guide = guide_legend(direction = "horizontal", title.position = "top",                                      ticks=TRUE,label.position="bottom")) + 
theme(legend.background = element_rect(colour = "black"),
    legend.key = element_rect(color='black'))

2 个答案:

答案 0 :(得分:6)

@ baptiste的评论让我有兴趣尝试创建一个可以成为传奇的情节。这是我的尝试。我使用geom_tile来创建一个将成为传奇的情节。 OP没有提供样本数据,因此我使用内置的mtcars数据创建了一个绘图,只是为了将图例放在旁边。然后我使用grid.arrange创建最终的plot-plus-legend布局。

library(ggplot2)
library(grid)
library(gridExtra) 

## Create legend

# Fake data
dat = data.frame(x=1:4, y="Group", col=factor(1:4))

# Create a plot that will become the legend
legend = ggplot(dat, aes(x,y, fill=col)) + 
  geom_tile(show.legend=FALSE) +
  scale_x_continuous(breaks=c(1.5,2.5,3.5), labels=c(5,10,20)) +
  scale_fill_manual(values=c("yellow","orange","red","darkred")) +
  labs(y="", x="") +
  ggtitle("No. of Restaurants") +
  theme_bw() +
  theme(panel.border=element_blank(),
        axis.ticks.y=element_blank(),
        axis.text.y=element_blank())

## Create a plot to put next to the legend
p1 = ggplot(mtcars, aes(mpg, wt)) + 
  geom_point() +
  theme(plot.margin=unit(c(0,0,0,0)))

# Arrange plot and legend
grid.arrange(p1, arrangeGrob(rectGrob(gp=gpar(col=NA)), 
                             legend,
                             rectGrob(gp=gpar(col=NA)),
                             heights=c(0.42,0.16,0.42)), 
             widths=c(0.8,0.2))

enter image description here

答案 1 :(得分:3)

可能会更容易定义自己的自定义图例

library(gridExtra)
library(grid)

stripGrob <- function(cols = c("yellow","orange","red","darkred"), 
                      labels= c(5,10,20), 
                      gp=gpar(fontsize=10,fontface="italic"), vp=NULL){
  n <- length(cols)
  rg <- rasterGrob(t(cols), y=1, vjust=1, interpolate = FALSE)
  sg <- segmentsGrob(x0=seq(1/n, 1-1/n, length.out=n-1),
                     x1=seq(1/n, 1-1/n, length.out=n-1),
                     y0=unit(1,"npc") - grobHeight(rg),
                     y1=unit(1,"npc") - grobHeight(rg) - unit(2,"mm"),
                     gp=gpar(lwd=2))
  tg <- textGrob(labels, x=seq(1/n, 1-1/n, length.out=n-1),
                 unit(1,"npc") - grobHeight(rg) - grobHeight(sg) - unit(1,"mm"), 
                 vjust=1)

  stripGrob <- gTree(children = gList(rg, tg, sg), gp=gp, vp=vp)
}

qplot(1,1) +
  annotation_custom(grob=stripGrob(), xmax=1.0)

enter image description here