2013-05-05 5 views
17

다른 데이터 프레임의 데이터를 사용하여 ggplot2에지도를 작성하려고합니다. 모든 것이 예상대로 작동하고 나는 좋은지도를 얻을 지금까지ggplot2에서 범례를 추가하려면 어떻게해야합니까?

library(maptools) 

xx <- readShapePoly(system.file("shapes/sids.shp", package="maptools")[1], IDvar="FIPSNO", proj4string=CRS("+proj=longlat +ellps=clrk66")) 

xx.sub1 <- subset(xx, xx$FIPSNO < 37010) 
xx.sub2 <- subset(xx, xx$FIPSNO > 37010) 

[email protected]$id <- rownames([email protected]) 
xx.sub1.points <- fortify(xx.sub1, region="id") 
xx.sub1.df = join(xx.sub1.points, [email protected], by="id") 

[email protected]$id <- rownames([email protected]) 
xx.sub2.points <- fortify(xx.sub2, region="id") 
xx.sub2.df = join(xx.sub2.points, [email protected], by="id") 

ggplot(xx.sub2.df) + 
    aes(long, lat, fill = (SID79/BIR79)*1000, group = group) + 
    geom_polygon() + geom_path(color="grey80") + 
    coord_equal() + 
    scale_fill_gradientn(colours = brewer.pal(7, "YlOrBr")) + 
    geom_polygon(data = xx.sub1.df, fill = "grey50") + 
    geom_path(data = xx.sub1.df, color="grey80") + 
    labs(fill = "Mapped value", title = "Title") 

: 나는 그러나 변경하려면 무엇

enter image description here

xx.sub1.df에서 데이터에 대해 별도의 범례를 추가하는 것입니다 - 이후 모든 다각형은 회색으로 채워져 있습니다. 추가 항목 하나가되기를 바랍니다.

어떻게하면됩니까?

+3

재현 가능한 예 (http://tinyurl.com/reproducible-000)주세요. 이 문제를 해결할 수있는 표준 방법은 데이터 세트를 병합하여 각 데이터 세트의 원래 데이터 프레임을 식별하는 요인 변수를 포함시킨 다음 미적 감각을 사용하는 것입니다. 'scales' 패키지가 다른 방법이 있는지 확인하십시오. –

+0

@BenBolker Roger. 예제가 추가되었습니다. 한 가지 방법으로 모든 것을 갖기가 더 쉬울 것이라는 것을 알고 있습니다. 그러나, 나는 종종 서로 다른 계층의 데이터로 작업한다. (GIS 배경에서 나오는 편견일지도 모른다) 목에 통증이 생길 수있다. 그리고이 특별한 예에서는 몇 가지 다각형을 선택하고 빠른 방법으로 '강조'또는 '마스크'해야합니다. – radek

+0

업데이트 된 히트 맵을 사용하여 질문에 답변 할 수 있도록 데이터의 '출력'을 추가 할 수 있습니까? 나는 그것을 추측하고있다 : (1)'xx.sub2'의 2 개의 열만 사용하고, (2)'xx.sub1'에 존재하는 상태는 회색으로 표시됩니다. 따라서 합류하지 않는 것은 짜증나는 것처럼 보입니다. 단순히'xx.sub2'에 인수를'xx.sub1'에있는 항목에 추가하고,'scale_fill_manual'을 사용하여 범례의 색상을 조정할 수 있습니다. –

답변

23

저는 이것이 당신이 원하는 것이라고 100 % 확신하지는 않지만, 제가 이해할 때 문제를 해결하는 방법은 다음과 같습니다. 일부 미사용 geomxx.sub1.df의 데이터로 매핑하지만 플롯에서 보이지 않게하는 경우 해당 geom에 대한 범례를 얻을 수 있습니다. 여기서는 geom_point을 사용했지만 다른 사람들도 만들 수 있습니다.

enter image description here

p <- ggplot(xx.sub2.df) + 
    aes(long, lat, fill = (SID79/BIR79)*1000, group = group) + 
    geom_polygon() + geom_path(color="grey80") + 
    coord_equal() + 
    scale_fill_gradientn(colours = brewer.pal(7, "YlOrBr")) + 
    geom_polygon(data = xx.sub1.df, fill = "grey50") + 
    geom_path(data = xx.sub1.df, color="grey80") + 
    labs(fill = "Mapped value", title = "Title") 

#Now we add geom_point() setting shape as NA, but the colour as "grey50", so the 
#legend will be displaying the right colour 

p2 <- p + geom_point(data = xx.sub1.df, aes(size="xx.sub1", shape = NA), colour = "grey50") 

이제 우리는 (이 earlier을 보여 @DizisElferts 덕분에) 전설의 점의 크기와 모양을 변경하고, 전설의 이름을 변경해야합니다. 당신이 보여주고 싶은 것을 강조 레이블이 일을하거나 어떤 방법을 변경할 수 있습니다 물론

p2 + guides(size=guide_legend("Source", override.aes=list(shape=15, size = 10))) 

enter image description here

.

본인이 아닐 경우 알려 주시기 바랍니다.

+0

좋습니다! 그것은 나에게 그들이 범례가 추가 될 수있는 새로운 미학 (여기서는'geom_point')을 추가하는 것보다 다른 해결 방법이 아닌 것처럼 보였습니다. 나는'shape = NA'에 관해 몰랐다. 그래서 그것은 정말로 유용하다. –

관련 문제