2010-11-19 23 views
16

私のデータの数を示すのにgeom_pointを使用しようとしています。私はまた、グラフ内のいくつかの点にgeom_textと注釈を付けることを望みます。 geom_textへのコールを追加すると、凡例のポイントの下に何かがプロットされているように見えます。私は無駄に層の順序を逆にしようとしました。私はなぜこれをやっているのか、私の頭を包み込むことはできません。誰もこれを見たことがありますか?ggplot凡例の問題geom_pointとgeom_text

set.seed(42) 
df <- data.frame(x = 1:10 
    , y = 1:10 
    , label = sample(LETTERS,10, replace = TRUE) 
    , count = sample(1:300, 10, replace = FALSE) 
) 

p <- ggplot(data = df, aes(x = x, y = y, size = count)) + geom_point() 
p + geom_text(aes(label = label, size = 150, vjust = 2)) 

alt text

答えて

24

これは私にすべての時間を起こりました。このトリックは、aes()がデータを美学にマップすることを知っています。マップするデータがない場合(たとえば、1つの値を決定した場合など)、aes()を使用する理由はありません。私はaes()の中のものだけがあなたの伝説に現れると信じています。

さらに、ggplot(aes())の内部にマッピングを指定すると、これらのマッピングは、すべての後続レイヤにに適用されます。あなたのxとyには、geom_pointgeom_textの両方が使われているので、これは良いことです。それはポイントにのみ適用されるので、size = countのために悪いです。 aes()の内部

  1. のみ置くデータベースのマッピング:

    は、したがって、これらは、この種のものを防ぐために、私の2つのルールです。引数が1つの既定値をとっている場合は、の外のaes()のレイヤに渡します。

  2. マップデータを使用する層のみです。結果:ggplot(aes())内のデータのみをマップします。これは、後続のすべてのレイヤーで使用されると確信している場合です。それ以外の場合は、レイヤーレベルでマップします。

だから私はthuslyこれをプロットします:

p <- ggplot(data = df, aes(x = x, y = y)) + geom_point(aes(size = count)) 
p + geom_text(aes(label = label), size = 4, vjust = 2) 
+2

あなたの2つのルールは関連しています! – kohske

+0

未来を知るための非常に有用なヒント、私はまだベストプラクティスw/ggplot2の周りを頭で覆そうとしています。プロットするデータオブジェクトをサブセット化するための提案はありますか?たとえば、最初と最後のポイントにのみ注釈を付ける場合はどうしますか?私は 'geom_text(data = df [grep(" xxx "、df $ label)、]、aes(x = ...))'のようなものを使っています。それを行うより良い方法はありますか? – Chase

+0

チェイス - それは良い質問です。新しい質問をすることは賢明かもしれません。私にはあいまいな考えがありますが、他の誰かが具体的な考えを持っている可能性があります。 –

17

か、あなたはAES内のテキストのサイズを指定する必要がある場合は、GEOMの伝説を描いて、その後伝説= FALSE抑制:

p <- ggplot(data = df, aes(x = x, y = y, size = count)) + geom_point() 
p + geom_text(aes(label = label, size = 150, vjust = 2), show_guide = FALSE) 
+1

ああ、レイヤーレベルでそれを使用することは決してありませんでした。うまくいった。 –

+0

それは知っている素敵なトリックです!ありがとう。 – Chase

+2

ちょっとした情報: "legend"は "show_guides"に置き換えられました:geom_XXXの "legend"引数であり、stat_XXXは非推奨です。ガイド表示を表示または非表示にするには、show_guide = TRUEまたはshow_guide = FALSEを使用してください。 – Andreas

関連する問題