저장하고 프레젠테이션을 더 멋지게 만들기 위해지도에서 두 개의 범례를 독립적으로 이동하고 싶습니다.
데이터는 다음과 같습니다.
## 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] 삭제
몇 마디 만하겠습니다