2013-07-31 23 views
6

我試圖將美國地圖分成多個窗口(其中一些包含相同的狀態兩次)。我希望比例不變(這樣地圖不會變形),但是也可以最小化地圖之間的空間。我無法使用facet_wrap(由於區域的重疊性質 - 無論如何,facet_wrap無法將縮放比例固定,並且對於每個窗口都有不同的xlim)。有關如何改善結果間距的任何建議?安排ggplot維持恆定高度的多個對象

require(data.table) 
require(ggplot2) 
require(maps) 
require(gridExtra) 
all_states <- as.data.table(map_data("state")) 

setnames(all_states,"region","state") 

##define regions with overlapping states 
weco.states <- c("oregon","washington","california") 
west.states <- c("washington","montana", "idaho","utah","nevada","arizona","new mexico", 
    "wyoming","colorado","south dakota","texas") 
east.states <- c(setdiff(unique(all_states$state), union(weco.states,west.states)), 
    "texas","south dakota") 
all_states[,c("weco","west","east"):=FALSE] 
all_states[state%in% weco.states, weco:=TRUE] 
all_states[state%in% west.states, west:=TRUE] 
all_states[state%in% east.states, east:=TRUE] 


p.regbase <- ggplot() + coord_equal() +ylim(c(25,50)) 
p.weco <- p.regbase + geom_polygon(data=all_states[(weco),], aes(x=long, y=lat, group = group),colour="white", fill="grey") 
p.west <- p.regbase + geom_polygon(data=all_states[(west),], aes(x=long, y=lat, group = group),colour="white", fill="grey") 
p.east <- p.regbase + geom_polygon(data=all_states[(east),], aes(x=long, y=lat, group = group),colour="white", fill="grey") 

print(arrangeGrob(p.weco,p.west,p.east,ncol=3,nrow=1)) 

取決於我如何調整在Windows GUI圖形窗口中,其結果要麼是壞的(尺度是不同的) enter image description here

或體面的(同一高度),但有太多的空間:哪有我擺脫了額外的空間?

enter image description here

+0

可以傳遞'寬度=單元(c(1,2,3), 「空」)''到arrangeGrob',和手動調整的相關因素。 – baptiste

+0

這並沒有解決這樣一個事實,即arrangeGrob填充第一個圖形周圍的空白區域。 – Michael

+0

我看不出這是如何解決這個問題的。如果可以的話,你能證明一下嗎?我提供了完全可用的示例代碼... – Michael

回答

5

這是一個使用facet_grid()和有點模糊的設置theme(aspect.ratio=1)的解決方案。情節並不完美,但我希望它能給你所需要的大部分東西。請注意,狀態看起來比他們應該更寬一些。顯然,1度緯度與美國1度經度的距離顯然不同。

# Create a new factor column for faceting. 
newfactor = ifelse(all_states$weco, "weco", 
          ifelse(all_states$west, "west", "east")) 

# Manually specify sort order of factor levels. 
newfactor = factor(as.character(newfactor), levels=c("weco", "west", "east")) 

all_states$region = newfactor 

plot_1 = ggplot(all_states, aes(x=long, y=lat, group=group)) + 
     geom_polygon(colour="white", fill="grey") + 
     facet_grid(. ~ region, space="free", scales="free") + 
     theme(aspect.ratio=1) 

ggsave("plot_1.png", plot=plot_1, height=4, width=8, dpi=150) 

enter image description here

+0

這幾乎是完美的 - 我想要一些州在多個地區,但這很容易通過複製它們並對它們進行綁定來完成(因此,例如有兩組華盛頓行 - 一個在weco和一個在西部)。萬分感謝!我真的開始相信這是不可能的。拉伸狀態問題僅僅是因爲地圖不使用投影座標,這不是什麼大問題。 – Michael

+1

'+ coord_map(「lambert」,lat0 = 25,lat1 = 50)'投影地圖(在本例中爲lambert) – Michael

5

讓我們澄清一些事情。

  • grid.arrange不會「添加填充」,它只是將柵格並排排列。可以改變每一個單元的寬度的行中,

grid.newpage() 
pushViewport(viewport(width=5, height=2.5, default.units="in")); 
gt = grobTree(rectGrob(), circleGrob()) 
grid.arrange(gt, gt, gt, nrow=1, newpage=FALSE, 
      widths = unit(c(1, 2, 3), "null")) 
upViewport() 

enter image description here

  • 對準地塊是容易當它們不具有固定的寬高比,例如使用gtable ::: cbind_gtable

  • 固定縱橫比是通過相對於空的網格單元編碼在gtable,因爲你可以容易地與檢查,


g = ggplotGrob(p.weco) 
g[["heights"]][3] # 2.37008405379269 is the aspect ratio for that plot panel 

  • 固定寬高比ggplot2設置寬度不能很好地工作的原因有兩方面:i)很難猜測我們應該分配哪些相對寬度,因爲取決於根據數據範圍計算的寬高比; ii)設備寬度和高度也應根據三個高寬比進行設置,以避免額外的空白空間(必須保持正確的高寬比)

這些問題have been discussed here;我不知道一個優雅而通用的解決方案。