지도에서 2 개의 범례 ggplot2를 독립적으로 이동

타일러 린커

저장하고 프레젠테이션을 더 멋지게 만들기 위해지도에서 두 개의 범례를 독립적으로 이동하고 싶습니다.

데이터는 다음과 같습니다.

##              INST..SUB.TYPE.DESCRIPTION Enrollment      lat       lng
## 1                        CHARTER SCHOOL        274 42.66439 -73.76993
## 2                 PUBLIC SCHOOL CENTRAL        525 42.62502 -74.13756
## 3     PUBLIC SCHOOL CENTRAL HIGH SCHOOL         NA 40.67473 -73.69987
## 4                    PUBLIC SCHOOL CITY        328 42.68278 -73.80083
## 5            PUBLIC SCHOOL CITY CENTRAL        288 42.15746 -78.74158
## 6                  PUBLIC SCHOOL COMMON         NA 43.73225 -74.73682
## 7     PUBLIC SCHOOL INDEPENDENT CENTRAL        284 42.60522 -73.87008
## 8  PUBLIC SCHOOL INDEPENDENT UNION FREE        337 42.74593 -73.69018
## 9             PUBLIC SCHOOL SPECIAL ACT         75 42.14680 -78.98159
## 10             PUBLIC SCHOOL UNION FREE        256 42.68424 -73.73292

이 게시물에서 두 개의 범례를 독립적으로 이동할 수 있지만 시도 할 때 범례가 원하는 위치로 이동하지 않는 것을 보았습니다 ( e1그림에서와 같이 왼쪽 위 모서리, 플롯에서와 같이 오른쪽 가운데 e2).

https://stackoverflow.com/a/13327793/1000343

원하는 최종 출력이 다른 그리드 플롯과 병합되므로 어떻게 든 grob으로 할당 할 수 있어야합니다. 다른 게시물이 효과가 있었기 때문에 실제로 어떤 일이 일어나고 있는지 설명하지 않으므로 실제로 전설을 이동하는 방법을 이해하고 싶습니다.

내가 시도하고있는 코드는 다음과 같습니다.

library(ggplot2); library(maps); library(grid); library(gridExtra); library(gtable)
ny <- subset(map_data("county"), region %in% c("new york"))
ny$region <- ny$subregion

p3 <- ggplot(dat2, aes(x=lng, y=lat)) + 
    geom_polygon(data=ny, aes(x=long, y=lat, group = group)) 

(e1 <- p3 + geom_point(aes(colour=INST..SUB.TYPE.DESCRIPTION, 
    size = Enrollment), alpha = .3) +
    geom_point() + 
    theme(legend.position = c( .2, .81),
        legend.key = element_blank(),
        legend.background = element_blank())  +
    guides(size=FALSE, colour = guide_legend(title=NULL, 
        override.aes = list(alpha = 1, size=5))))


leg1 <- gtable_filter(ggplot_gtable(ggplot_build(e1)), "guide-box") 



(e2 <- p3 + geom_point(aes(colour=INST..SUB.TYPE.DESCRIPTION, 
    size = Enrollment), alpha = .3) +
    geom_point() + 
    theme(legend.position = c( .88, .5),
        legend.key = element_blank(),
        legend.background = element_blank())  +
    guides(colour=FALSE))

leg2 <- gtable_filter(ggplot_gtable(ggplot_build(e2)), "guide-box") 

(e3 <- p3 + geom_point(aes(colour=INST..SUB.TYPE.DESCRIPTION, 
    size = Enrollment), alpha = .3) +
    geom_point() + 
    guides(colour=FALSE, size=FALSE))



plotNew <- arrangeGrob(leg1, e3, 
         heights = unit.c(leg1$height, unit(1, "npc") - leg1$height), ncol = 1)

plotNew <- arrangeGrob(plotNew, leg2,
          widths = unit.c(unit(1, "npc") - leg2$width, leg2$width), nrow = 1)

grid.newpage()
plot1 <- grid.draw(plotNew)


plot2 <- ggplot(mtcars, aes(mpg, hp)) + geom_point()
grid.arrange(plot1, plot2)

## 나는 또한 동점 :

e3 + 
    annotation_custom(grob = leg2, xmin = -74, xmax = -72.5, ymin = 41, ymax = 42.5) +
    annotation_custom(grob = leg1, xmin = -80, xmax = -76, ymin = 43.7, ymax = 45)

## dput 데이터 :

dat2 <- 
structure(list(INST..SUB.TYPE.DESCRIPTION = c("CHARTER SCHOOL", 
"PUBLIC SCHOOL CENTRAL", "PUBLIC SCHOOL CENTRAL HIGH SCHOOL", 
"PUBLIC SCHOOL CITY", "PUBLIC SCHOOL CITY CENTRAL", "PUBLIC SCHOOL COMMON", 
"PUBLIC SCHOOL INDEPENDENT CENTRAL", "PUBLIC SCHOOL INDEPENDENT UNION FREE", 
"PUBLIC SCHOOL SPECIAL ACT", "PUBLIC SCHOOL UNION FREE"), Enrollment = c(274, 
525, NA, 328, 288, NA, 284, 337, 75, 256), lat = c(42.6643890904276, 
42.6250153712452, 40.6747307730359, 42.6827826714356, 42.1574638634531, 
43.732253, 42.60522, 42.7459287878497, 42.146804, 42.6842408825698
), lng = c(-73.769926191186, -74.1375573966339, -73.6998654715486, 
-73.800826733851, -78.7415828275227, -74.73682, -73.87008, -73.6901801893874, 
-78.981588, -73.7329216476674)), .Names = c("INST..SUB.TYPE.DESCRIPTION", 
"Enrollment", "lat", "lng"), row.names = c(NA, -10L), class = "data.frame")

원하는 출력 :

여기에 이미지 설명 입력

샌디 무스 프라 트

뷰포트는 어느 정도 정밀하게 배치 할 수 있습니다. 아래 예에서 두 개의 범례가 추출 된 다음 자체 뷰포트에 배치됩니다. 뷰포트는 위치를 표시하기 위해 색상이 지정된 직사각형 내에 포함됩니다. 또한 뷰포트 내에지도와 산점도를 배치했습니다. 왼쪽 상단 범례가 사용 가능한 공간에 꽉 들어가도록 텍스트 크기와 점 크기를 올바르게 가져 오는 것은 약간의 조작이었습니다.

library(ggplot2); library(maps); library(grid); library(gridExtra); library(gtable)
ny <- subset(map_data("county"), region %in% c("new york"))
ny$region <- ny$subregion

p3 <- ggplot(dat2, aes(x = lng, y = lat)) + 
    geom_polygon(data=ny, aes(x = long, y = lat, group = group)) 

# Get the colour legend
(e1 <- p3 + geom_point(aes(colour = INST..SUB.TYPE.DESCRIPTION, 
    size = Enrollment), alpha = .3) +
    geom_point() + theme_gray(9) +
    guides(size = FALSE, colour = guide_legend(title = NULL, 
        override.aes = list(alpha = 1, size = 3))) +
    theme(legend.key.size = unit(.35, "cm"),
        legend.key = element_blank(),
        legend.background = element_blank()))

leg1 <- gtable_filter(ggplot_gtable(ggplot_build(e1)), "guide-box") 

# Get the size legend
(e2 <- p3 + geom_point(aes(colour=INST..SUB.TYPE.DESCRIPTION, 
    size = Enrollment), alpha = .3) +
    geom_point() + theme_gray(9) +
    guides(colour = FALSE) +
    theme(legend.key = element_blank(),
        legend.background = element_blank()))

leg2 <- gtable_filter(ggplot_gtable(ggplot_build(e2)), "guide-box") 

# Get first base plot - the map
(e3 <- p3 + geom_point(aes(colour = INST..SUB.TYPE.DESCRIPTION, 
    size = Enrollment), alpha = .3) +
    geom_point() + 
    guides(colour = FALSE, size = FALSE))

# For getting the size of the y-axis margin
gt <- ggplot_gtable(ggplot_build(e3))  

# Get second base plot - the scatterplot
plot2 <- ggplot(mtcars, aes(mpg, hp)) + geom_point()


# png("p.png", 600, 700, units = "px")
grid.newpage()
# Two viewport: map and scatterplot
pushViewport(viewport(layout = grid.layout(2, 1))) 

# Map first
pushViewport(viewport(layout.pos.row = 1))
grid.draw(ggplotGrob(e3))

# position size legend
pushViewport(viewport(x = unit(1, "npc") - unit(1, "lines"), 
                      y = unit(.5, "npc"), 
                      w = leg2$widths, h = .4,
                      just = c("right", "centre")))
grid.draw(leg2)
grid.rect(gp=gpar(col = "red", fill = "NA"))
popViewport()

# position colour legend
pushViewport(viewport(x = sum(gt$widths[1:3]),
                      y = unit(1, "npc") - unit(1, "lines"), 
                      w = leg1$widths, h = .33,
                      just = c("left", "top")))
grid.draw(leg1)
grid.rect(gp=gpar(col = "red", fill = "NA"))
popViewport(2)

# Scatterplot second
pushViewport(viewport(layout.pos.row = 2))
grid.draw(ggplotGrob(plot2))
popViewport()
# dev.off()

여기에 이미지 설명 입력

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

ggplot2 : 기존 범례에 수동으로 범례 추가

분류에서Dev

범례를 그룹화하거나 ggplot2에서 패싯별로 별도의 범례를 얻는 방법

분류에서Dev

ggplot2에서 두 개의 이산 스케일에 대한 범례

분류에서Dev

ggplot2의 범례에서 키 레이블 변경

분류에서Dev

ggplot2의 범례에서 레이블 제거

분류에서Dev

ggplot2 : scale_colour_brewer ()를 사용하고 수동으로 범례 이름 / 항목 레이블 지정

분류에서Dev

ggplot2 : 범례의 이탤릭체

분류에서Dev

ggplot2의 여러 레이어에 대한 범례

분류에서Dev

ggplot2에 대한 범례의 레이블 변경

분류에서Dev

R의 선 그래프 ggplot2에 대한 수동 범례 레이블

분류에서Dev

R의 ggplot2에 세 개의 범례 그룹 만들기

분류에서Dev

ggplot2의 범례에 변수를 넣는 방법

분류에서Dev

내 ggplot2의 범례에서 선을 점선으로 변경

분류에서Dev

ggplot2를 사용하여 '색상'및 '채움'두 개의 서로 다른 도형에 대한 혼합 범례

분류에서Dev

범례를 ggplot2의 막대 순서와 동기화하는 방법은 무엇입니까?

분류에서Dev

ggplot2지도와 일치하도록 연속 채우기 축척 범례에 알파 매개 변수를 적용합니다.

분류에서Dev

내 코드가 ggplot2의 그림에 범례를 추가 할 수없는 이유

분류에서Dev

ggplot2로 비례 주파수를 플로팅하지만 일부 데이터 범주는 제외

분류에서Dev

ggplot2의 범례에 모양 지정

분류에서Dev

모양, 선 종류, 라벨이 ggplot2에 정의 된 전체 수동 범례

분류에서Dev

ggplot2에 수동으로 범례 추가가 작동하지 않습니다.

분류에서Dev

ggplot2에서 범례를 x 축 레이블에 더 가깝게 이동하는 방법

분류에서Dev

ggplot2에서 범례의 일부 억제

분류에서Dev

ggplot2의 범례에서 회색 제거

분류에서Dev

ggplot2 : 색상과 모양의 범례를 하나로 결합 / 병합

분류에서Dev

2 행의 ggplot2 범례

분류에서Dev

채워진지도의 geom_point에 대한 ggplot2 범례

분류에서Dev

ggplot2 범례에서 선 종류별로 사용자 정의 이름 및 스타일을 지정할 수 없습니다.

분류에서Dev

cowplot / ggplot2를 사용하여 빈 패널에 범례 플로팅

Related 관련 기사

  1. 1

    ggplot2 : 기존 범례에 수동으로 범례 추가

  2. 2

    범례를 그룹화하거나 ggplot2에서 패싯별로 별도의 범례를 얻는 방법

  3. 3

    ggplot2에서 두 개의 이산 스케일에 대한 범례

  4. 4

    ggplot2의 범례에서 키 레이블 변경

  5. 5

    ggplot2의 범례에서 레이블 제거

  6. 6

    ggplot2 : scale_colour_brewer ()를 사용하고 수동으로 범례 이름 / 항목 레이블 지정

  7. 7

    ggplot2 : 범례의 이탤릭체

  8. 8

    ggplot2의 여러 레이어에 대한 범례

  9. 9

    ggplot2에 대한 범례의 레이블 변경

  10. 10

    R의 선 그래프 ggplot2에 대한 수동 범례 레이블

  11. 11

    R의 ggplot2에 세 개의 범례 그룹 만들기

  12. 12

    ggplot2의 범례에 변수를 넣는 방법

  13. 13

    내 ggplot2의 범례에서 선을 점선으로 변경

  14. 14

    ggplot2를 사용하여 '색상'및 '채움'두 개의 서로 다른 도형에 대한 혼합 범례

  15. 15

    범례를 ggplot2의 막대 순서와 동기화하는 방법은 무엇입니까?

  16. 16

    ggplot2지도와 일치하도록 연속 채우기 축척 범례에 알파 매개 변수를 적용합니다.

  17. 17

    내 코드가 ggplot2의 그림에 범례를 추가 할 수없는 이유

  18. 18

    ggplot2로 비례 주파수를 플로팅하지만 일부 데이터 범주는 제외

  19. 19

    ggplot2의 범례에 모양 지정

  20. 20

    모양, 선 종류, 라벨이 ggplot2에 정의 된 전체 수동 범례

  21. 21

    ggplot2에 수동으로 범례 추가가 작동하지 않습니다.

  22. 22

    ggplot2에서 범례를 x 축 레이블에 더 가깝게 이동하는 방법

  23. 23

    ggplot2에서 범례의 일부 억제

  24. 24

    ggplot2의 범례에서 회색 제거

  25. 25

    ggplot2 : 색상과 모양의 범례를 하나로 결합 / 병합

  26. 26

    2 행의 ggplot2 범례

  27. 27

    채워진지도의 geom_point에 대한 ggplot2 범례

  28. 28

    ggplot2 범례에서 선 종류별로 사용자 정의 이름 및 스타일을 지정할 수 없습니다.

  29. 29

    cowplot / ggplot2를 사용하여 빈 패널에 범례 플로팅

뜨겁다태그

보관