30

次の点を考慮してください。

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 出力 なります。 のコンテキストではplot.margin=unit(x=c(0,0,0,0),units="mm")、凡例の上に見苦しい量の白い (赤い) スペースがあります。誰もそれを修正する方法を知っていますか?

ヒントをありがとう。

敬具、ジョー

4

3 に答える 3

14

見やすくするために余白を誇張して 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)

ここに画像の説明を入力

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

編集:いいえ、それはラベルの不幸な重複です。それはタイトルではありません。

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

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 オプションであり、デフォルト値の半行に置き換えられていると思います。

ここに画像の説明を入力

于 2013-06-12T20:27:23.677 に答える
9

この質問が尋ねられた/回答されてから1年で、ggplotはメンテナンスモードに入ったため、将来の更新はありません(つまり、更新を待つというOPの戦略は機能しません)。

受け入れられた答えは、凡例の周りのマージンをlegend.margin. ggsave()ただし、特に異なるサイズや倍率で使用する場合、これはうまく一般化できません。幸いなことに、より一般化できる普遍的な解決策があります。

legend.marginすべての辺のパディングには 1 つの値しか取りませんがplot.margin、上、右、下、左のマージンには 4 つの値を取ります。デフォルトの余白は、次のように (mm やインチではなく) 行に基づいています。plot.margin=unit(c(c(1, 1, 0.5, 0.5)), units="line")

0 に設定すると、ライン単位に基づいてlegend.margin負の値を使用して、凡例をプロット エリアの端に移動できます。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"))

上の正しい凡例

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

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

下部の正しい凡例

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

于 2014-05-13T02:25:39.437 に答える