我正在使用ggplot绘制分面地图,并且无法弄清楚如何在每个方面允许“自由”比例(以便小区域看起来不会太小),同时保持xy宽高比固定。
这是一个简化的例子:
require(maps)
require(ggplot2)
map_nz <- subset(fortify(map_data('nz')),
region %in% c("South.Island ", "North.Island "))
gg_nz <- qplot(long, lat, data=map_nz, geom="polygon", group=group)
我现在有一个新西兰北岛和南岛的情节。我可以解决这个问题并以固定的宽高比显示它,如下所示:
gg_nz + coord_fixed() + facet_wrap(~region)
结果如下:
请注意,北岛小平面浪费了相当多的空间。我希望它占用更多的可用空间。我可以释放这样的音阶:
gg_nz + facet_wrap(~region, scales="free")
具有以下结果:
问题是每个方面的x-y纵横比不再是1:1。我很高兴每个方面都有不同的规模,但在方面我想保留宽高比。
我尝试了以下但没有成功:
gg_nz + facet_wrap(~region, scales="free") + coord_fixed()
大概scale
中的facet_wrap
参数会覆盖coord_fixed
。有什么建议吗?
更新:为了给出一个更具戏剧性的插图,这与美国一些州的情况相同:
固定坐标(使用coord_fixed
或coord_equal
):
免费坐标(使用scales = free
):
这些地图都不理想:首先,特拉华州很小。在第二种情况下,纵横比非常扭曲。例如,新泽西州是一个狭窄的国家,它被拉得太宽了。
答案 0 :(得分:5)
我相信你所寻找的是能够裁剪或放大单个方面的能力。换句话说,要为每个方面单独调整ylim
和xlim
s。看起来这样的功能已被请求但尚未实现(https://github.com/hadley/ggplot2/issues/187)
如果下面的space=free
选项不起作用,另一种方法是废弃构面并使用网格布局和/或视口手动打印每个图。
使用facet_grid
代替facet_wrap
并添加space=free
:
gg_state + facet_grid(~region, scales = "free_x", space="free")
也许不是让两个轴都自由缩放,只需要一个刻度:
map_state <- subset(fortify(map_data('state')),
region %in% c("california", "nevada"))
gg_state <- qplot(long, lat, data=map_state, geom="polygon", group=group)
gg_state + facet_wrap(~region, scales="free_x")
答案 1 :(得分:4)
theme(aspect.ratio = 1)
有效。
gg_nz + facet_wrap(~region, scales="free") + theme(aspect.ratio = 1)
答案 2 :(得分:1)
coord_equal
有帮助吗?
gg_nz + facet_wrap(~region, scales="free") + coord_equal()
您可以使用grid.arrange
手动将图表放在页面上,固定宽度和高度。这似乎可以解决问题,但我无法使用facet()
功能。感谢来自@mnel的this post。
nz_sth <- qplot(long, lat, data=map_nz[map_nz$region == "South.Island ",], geom="polygon", group=group) + coord_fixed()
nz_nth <- qplot(long, lat, data= map_nz[ map_nz$region == "North.Island " , ] , geom="polygon", group=group) + coord_fixed()
grid.arrange( heights=unit(0.75, "npc") , widths=unit(0.5, "npc") , nz_sth,nz_nth, ncol=2)