4

マップ上の 2 つの凡例を個別に移動して保存し、プレゼンテーションをより良くしたいと考えています。

データは次のとおりです。

##              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

この投稿で、2 つの凡例を独立して移動できることを見ましたが、試してみると、凡例が目的の場所に移動しません (プロットのように左上隅、e1プロットのように右中央e2)。

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

最終的な目的の出力は別のグリッド プロットとマージされるため、何らかの方法でそれをグロブとして割り当てることができる必要があります。他の投稿がそれらのために働いたので、実際に凡例を移動する方法を理解したいのですが、何が起こっているのか説明していません。

これが私が試しているコードです:

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)

## 出力データ:

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")

望ましい出力:

ここに画像の説明を入力

4

4 に答える 4

5

ところで、複数を使用することは可能ですannotation_custom:

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))


leg2Grob <- grobTree(leg2)
leg3Grob <- grobTree(leg2)
leg4Grob <- grobTree(leg2)
leg5Grob <- grobTree(leg2)
leg1Grob <- grobTree(leg1)

p = e3 +
  annotation_custom(leg2Grob, xmin=-73.5, xmax=Inf, ymin=41, ymax=43) +
  annotation_custom(leg1Grob, xmin=-Inf, xmax=-76.5, ymin=43.5, ymax=Inf) +
  annotation_custom(leg3Grob, xmin = -Inf, xmax = -79, ymin = -Inf, ymax =  41.5) +
  annotation_custom(leg4Grob, xmin = -78, xmax = -76, ymin = 40.5, ymax = 42) +
  annotation_custom(leg5Grob, xmin=-73.5, xmax=-72, ymin=43.5, ymax=Inf)
p

ここに画像の説明を入力

于 2014-02-21T22:51:37.677 に答える
4

これは機能しますが、微調整が必​​要です。必要な場所に 1 つの凡例をプロットしてから、 を使用annotation_customして 2 番目の凡例を追加します。これは、n 個の凡例に一般化できません。それができる答えがあればいいですね。一度に1 つしか使用できないようですannotation_custom

plot1 <- e1 + 
    annotation_custom(grob = leg2, xmin = -74, xmax = -72.5, ymin = 41, ymax = 42.5) 

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

ここに画像の説明を入力

于 2014-02-15T18:22:33.833 に答える
4

ビューポートはある程度の精度で配置できます。以下の例では、2 つの凡例が抽出され、独自のビューポート内に配置されています。ビューポートは、その位置を示すために色付きの長方形に含まれています。また、マップと散布図をビューポート内に配置しました。テキストのサイズとドットのサイズを正しく設定して、左上の凡例が使用可能なスペースに収まるようにするのは少し手間がかかりました。

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()

ここに画像の説明を入力

于 2014-02-19T02:54:26.640 に答える
3

@Tyler Rinker がすでに彼自身の回答で述べているように、問題は複数では解決できませんannotation_custom。次のコードは非常にコンパクトで完全です (ただし、凡例を適切に配置するには微調整が必​​要です)。

p <- ggplot(dat2, aes(x=lng, y=lat)) + 
  geom_polygon(data=ny, aes(x=long, y=lat, group = group)) +
  geom_point(aes(colour=INST..SUB.TYPE.DESCRIPTION,size = Enrollment), alpha = .3) +
  theme(legend.position = c( .15, .8),legend.key = element_blank(), legend.background = element_blank())

l1 <- p + guides(size=FALSE, colour = guide_legend(title=NULL,override.aes = list(alpha = 1, size=3)))
l2 <- p + guides(colour=FALSE)
leg2 <- gtable_filter(ggplot_gtable(ggplot_build(l2)), "guide-box") 

plot1 <- l1 +
  annotation_custom(grob = leg2, xmin = -73, xmax = -71.5, ymin = 41, ymax = 42.5)
plot2 <- ggplot(mtcars, aes(mpg, hp)) + geom_point()
grid.arrange(plot1, plot2)

@Tyler:これを自分の回答に自由に含めてください

于 2014-02-16T22:12:43.113 に答える