17

形状と色を示す2つの凡例(以下の例では「タイプ」と「組織」)を使用してマップを作成しようとしています。凡例を挿入します。凡例を配置することはできますが、左端が揃うように左揃えにしてください。私はそれらをお互いに関して中心に置く以外のものにすることはできません:

require(ggplot2)
require(ggmap)
require(grid)
require(mapproj)

data <- data.frame(Org=rep(c("ABCDEFG","HIJKLMNOP","QRSTUVWX"),4)
                   , Type=rep(c("Y","Z"),6), Lat=runif(12,48,54.5)
                   , Long=runif(12,-133.5,-122.5))

osmMap <- get_map(location=c(-134,47.5,-122,55), source = 'osm')

points <- geom_jitter(data=data, aes(Long, Lat, shape=Type
                                     , colour=Org))

legend <- theme(legend.justification=c(0,0), legend.position=c(0,0)
                , legend.margin=unit(0,"lines"), legend.box="vertical"
                , legend.key.size=unit(1,"lines"), legend.text.align=0
                , legend.title.align=0)

ggmap(osmMap) + points + legend

ここに画像の説明を入力してください

4

1 に答える 1

21

このオプションはggplot20.9.3.1で利用可能になりました。

ggmap(osmMap) + points + legend + theme(legend.box.just = "left")

古い手動ソリューション:

解決策は次のとおりです。

require(gtable)
require(ggplot2)
require(ggmap)
require(grid)
require(mapproj)

# Original data
data <- data.frame(Org=rep(c("ABCDEFG","HIJKLMNOP","QRSTUVWX"),4),
                   Type=rep(c("Y","Z"),6), Lat=runif(12,48,54.5),
                   Long=runif(12,-133.5,-122.5))
osmMap <- get_map(location=c(-134,47.5,-122,55), source = 'google')
points <- geom_jitter(data=data, aes(Long, Lat, shape=Type, colour=Org))
legend <- theme(legend.justification=c(0,0), legend.position=c(0,0),
                legend.margin=unit(0,"lines"), legend.box="vertical",
                legend.key.size=unit(1,"lines"), legend.text.align=0,
                legend.title.align=0)

# Data transformation
p <- ggmap(osmMap) + points + legend
data <- ggplot_build(p)
gtable <- ggplot_gtable(data)

# Determining index of legends table
lbox <- which(sapply(gtable$grobs, paste) == "gtable[guide-box]")
# Each legend has several parts, wdth contains total widths for each legend
wdth <- with(gtable$grobs[[lbox]], c(sum(as.vector(grobs[[1]]$widths)), 
                                     sum(as.vector(grobs[[2]]$widths))))
# Determining narrower legend
id <- which.min(wdth)
# Adding a new empty column of abs(diff(wdth)) mm width on the right of 
# the smaller legend box
gtable$grobs[[lbox]]$grobs[[id]] <- gtable_add_cols(
                                      gtable$grobs[[lbox]]$grobs[[id]], 
                                      unit(abs(diff(wdth)), "mm"))
# Plotting
grid.draw(gtable)

Typeこれはまたはに依存しませんOrg。ただし、これでは2つ以上の凡例があるだけでは不十分です。また、グロブ(グラフィックオブジェクト)のリストが変更されるように変更を加えた場合は、凡例の位置を変更grobs[[8]]する必要がある場合があります。を参照して探してください。grobs[[i]]igtable$grobsTableGrob (5 x 3) "guide-box": 2 grobs ここに画像の説明を入力してください

編集: 1。どのgrobが凡例テーブルであるかを自動的に検出します。つまり、プロットの他の部分を変更した後に何も変更する必要はありません。2.幅の差の計算を変更しました。コードは、2つの凡例がある場合、つまり、より複雑な場合にも機能するようになりました。たとえば、次のようになります。

ここに画像の説明を入力してください

于 2012-11-18T03:31:46.250 に答える