web-dev-qa-db-ja.com

ggplot2、上部とマージンの凡例

以下を検討してください。

_library(ggplot2)
library(grid)
ggplot(diamonds, aes(clarity, fill=cut)) + 
  geom_bar() +   
  theme(
    plot.margin=unit(x=c(0,0,0,0),units="mm"),
    legend.position="top",
    plot.background=element_rect(fill="red")) +
  guides(fill=guide_legend(title.position="top"))
_

その出力は次のようになります。 ggplot2 output plot.margin=unit(x=c(0,0,0,0),units="mm")のコンテキストでは、凡例の上に見かけ上白(赤)のスペースがあります。誰かがそれを改善する方法を知っていますか?

ヒントをありがとう。

敬具、ジョー

24
balin

あなたが言ったように、私はあなたの例ではそれを見ることができませんが、マージンは伝説自体のものだと思います。以下を追加することで、凡例自体のマージンを削除できます。

+ theme(legend.margin=margin(t = 0, unit='cm'))

これは、ggplot2 v2.1.0以降に適用されます。少なくとも今のところ、古いソリューションも引き続き機能することに注意してください。

+ theme(legend.margin=unit(-0.6,"cm")) # version 0.9.x

32
sc_evans

見やすくするためにマージンを誇張してshowViewportsを実行すると、次のようになります。

p + guides(fill=guide_legend(keyheight=unit(1,"cm"))) + theme(plot.margin=unit(c(1,1,1,1),"cm"))
showViewport(col="black",label=TRUE, newpage=TRUE, leaves=FALSE)

enter image description here

そこから、存在しないタイトルがどういうわけかスペースを取っているように見えます。

編集:いいえ、それは残念ながらラベルが重なっているだけです。タイトルではありません。

問題を引き起こしていると思われる凡例自体を見てみましょう。

library(gtable)
g = ggplotGrob(p)
leg = gtable_filter(g, "guide")
plot(leg)
leg$heights
# sum(0.5lines, sum(1.5mm, 10mm, 0mm, 1.5mm), 0.5lines)+0cm
grid.rect(height=leg$heights) 
grid.rect(height=leg$heights - unit(1,"line"), gp=gpar(lty=2))

つまり、確かに、マージンを追加しているのは凡例です(合計で0.5 + 0.5 = 1行)。不足していると思いますguide.marginテーマのオプション 、これはデフォルト値の半分の行で置き換えられています。

enter image description here

11
baptiste

この質問の回答から1年で、ggplotは保守モードに入ったため、今後の更新はありません(つまり、OPの 更新を待機する戦略 は機能しません)。

受け入れられた答えは、凡例のマージンを_legend.margin_で埋めることに依存します。ただし、特にggsave()を異なるサイズまたはスケール係数で使用する場合、これは一般化しません。幸いにも、より一般化可能な普遍的な解決策があります。

_legend.margin_は、すべての側面のパディングに単一の値のみを使用しますが、_plot.margin_は、上、右、下、および左のマージンに4つの値を使用します。デフォルトのマージンは、次のように(mmまたはインチではなく)行に基づいています:plot.margin=unit(c(c(1, 1, 0.5, 0.5)), units="line")

_legend.margin_を0に設定すると、ライン単位に基づいて負の_plot.margin_値を使用して、凡例をプロットエリアのエッジに移動できます。上マージンを-0.5に設定すると、完全に機能します。

_ggplot(diamonds, aes(clarity, fill=cut)) + 
  geom_bar() +   
  theme(
    plot.margin=unit(c(-0.5, 1, 0.5, 0.5), units="line"),
    legend.position="top",
    plot.background=element_rect(fill="red"),
    legend.margin=unit(0, "lines")) +
  guides(fill=guide_legend(title.position="top"))
_

Correct legend on top

凡例が下部に配置されている場合も同じ考え方が機能します。

_ggplot(diamonds, aes(clarity, fill=cut)) + 
  geom_bar() +   
  theme(
    plot.margin=unit(c(1, 1, -0.5, 0.5), units="line"),
    legend.position="bottom",
    plot.background=element_rect(fill="red"),
    legend.margin=unit(0, "lines")) +
  guides(fill=guide_legend(title.position="top"))
_

Correct legend on bottom

関心のあるマージンを-0.5行に設定する限り、余分な空白は消えます。これは、任意のビューポートサイズと任意の幅/高さで機能するはずです。/ggsave()との/ scaleの組み合わせ

7
Andrew