如何对齐共享y轴的地图和箱线图

时间:2016-02-24 17:40:51

标签: r ggplot2

我正在尝试对齐或组合地图和箱形图,两者都以纬度作为y轴。我已经找到了许多方法来对齐情节,但似乎有一个地图涉及复杂的事情。我想让这两个地块无缝对齐,左边的地图和右边的箱子图。

这是两个图的示例代码:

library(ggplot2)
library(maps)
library(gridExtra)

##Plot base map
s_map <- map_data('state',region=c('south carolina','georgia','florida'))
p <- ggplot() + coord_fixed()
base_world <- p+geom_polygon(data=s_map, aes(x=long, y=lat, group=group), color="white", fill="grey72")

yscale <- c(24:34)

map1 <- base_world +
  coord_map(xlim = c(-83, -79.5),ylim = c(25, 34)) +
  xlab("") + 
  ylab("Latitude") +
  scale_y_discrete(labels=yscale)

##plot boxplot   (seasonal movements of an animal)
df <- data.frame("month"=month.abb,
                   "min"=c(26,26,26,28,28,29,29,29,28,28,26,26),
                   "lci"=c(27,27,27,29,29,30,30,30,29,29,27,27),
                   "med"=c(28,28,28,29,29,31,31,31,29,29,28,28),
                   "uci"=c(29,29,29,30,30,32,32,32,30,30,29,29),
                   "max"=c(30,30,30,31,31,33,33,33,31,31,30,30),
                    "order"=c(1:12))

boxplot1 <- ggplot(df, aes(x=factor(order), ymin = min, lower = lci, middle = med, upper = uci, ymax = max)) +
  geom_boxplot(stat = "identity") +
  ggtitle("Latitude by Month") +
  xlab("Month") + 
  ylab("Latitude") +
  ylim(24,33)

  grid.arrange(map1,boxplot1,ncol=2)

如何强制y轴和绘图高度相同,网格线对齐?

提前感谢您对此的看法 - 我对R还很新。

EDITED: 我已经尝试了十几个我发现的代码片段,而且根本没什么效果,所以我没想到列出它们会有所帮助。我一直在寻找一个真正的起点。

以下我发现的一个例子是强制绘图高度相同,但它似乎没有做任何事情:

# build the plots 
    map2 <- ggplot_gtable(ggplot_build(map1))
    boxplot2 <- ggplot_gtable(ggplot_build(boxplot1))

# copy the plot height from p1 to p2
boxplot2$heights <- map2

grid.arrange(map2,boxplot2,ncol=2,widths=c(1,5))

1 个答案:

答案 0 :(得分:1)

这可能适合你,我改变了三件事:

  • ggtitle("")添加到地图
  • theme(plot.margin())添加到两个图中以更改图表周围的空间(您可以使用这些值)
  • scale_y_continuous(limits=c(24,33), breaks=seq(24,33,by=1), expand=c(0,0))添加到绘图中,以创建与地图相同的轴刻度

List item

map1 <- base_world +
  coord_map(xlim = c(-83, -79.5),ylim = c(25, 34)) +
  xlab("") + 
  ylab("Latitude") +
  scale_y_discrete(labels=yscale) +
  ggtitle("") +
  theme(plot.margin=unit(c(0.5,-1.5,0.5,-8), "cm"))

boxplot1 <- ggplot(df, aes(x=factor(order), ymin = min, lower = lci, middle = med, upper = uci, ymax = max)) +
  geom_boxplot(stat = "identity") +
  ggtitle("Latitude by Month") +
  xlab("Month") + 
  ylab("Latitude") +
  scale_y_continuous(limits=c(24,33), breaks=seq(24,33,by=1), expand=c(0,0)) +
  labs(y=NULL) +
  theme(plot.margin=unit(c(0.5,0.5,0.5,-6), "cm"))

grid.arrange(map1,boxplot1,ncol=2)