2017-11-29 11 views
4

問題の部分的な解決方法はhereです。そのソリューションがどのように機能し、どの機能がまだ私のニーズを満たしていないかを示します。一貫性のために、私は他のスレッドからの1つに類似しているサンプルデータセットの使用:複数のgeomの色、形、線種を手動で拡大するggplot2

library(ggplot2) 
library(reshape2) 
library(tidyverse) 

df <- data.frame(x = c(1:5), a = c(1,2,3,3,3), b = c(1,1.1,1.3,1.5,1.5)) 
df <- mutate(df, log2 = log2(x)) 
df <- df <- melt(df, c("x", "log2")) 

を(次のコードによって作成された)データの最初のプロットは、個別の凡例にshapecolor美学を有し、これは望ましくない。

ggplot(df) + 
    geom_point(aes(x, value, colour = variable, shape = variable), size = 3) + 
    geom_line(aes(x, log2, color = "log2(x)"), size = 1.5) 

溶液は確かに元のプロットを超える改善である単一の凡例にこれらを組み合わせることguides()override.aesを使用して提案している。

ggplot(df) + 
    geom_point(aes(x, value, colour = variable, shape = variable), size = 3) + 
    geom_line(aes(x, log2, color = "log2(x)"), size = 1.5) + 
    guides(shape = FALSE, 
     colour = guide_legend(override.aes = list(shape = c(16, 17, NA), 
                linetype = c("blank", "blank", "solid")))) 

私の問題は、geom_pointgeom_lineの両方で、color審美的な手作業のコントロールを希望します。たとえば、三角形を明るい灰色、円を濃い灰色、そしてlog2(x)を明るい青色にしたいとします。しかし、

ggplot(df) + 
    geom_point(aes(x, value, shape = variable), color = "gray40", size = 3, data = filter(df, variable == "a")) + 
    geom_point(aes(x, value, shape = variable), color = "gray70", size = 3, data = filter(df, variable == "b")) + 
    geom_line(aes(x, log2, shape = "log2(x)"), color = "cadetblue2", size = 1.5) + 
    guides(shape = guide_legend(override.aes = list(color = c("gray40", "gray70", "cadetblue2"), 
                shape = c(16, 17, NA), 
                linetype = c("blank", "blank", "solid")))) 

これはgeom_lineshape美的の不適切な使用のように思える(生成される警告与えられた):どのようにguides()作品の私の理解では、私が行うことができた最高のため、以下である、非常に限られていますほぼの結果が欲しいです。問題は今、log2(x)の凡例アイコンが欠落していることです。理想的には、プロットに一致する水平の明るい青色の線が表示されるはずです。誰もこれを達成する方法を知っていますか、またはguides()機能の使用方法をよりよく説明できますか?

私も(同じname引数彼らは、単一の凡例で終わる必要があり、そのようにすべての)scale_color_manual()scale_linetype_manual()、およびscale_shape_manual()の組み合わせを使用して解決策を試してみました。このアプローチの問題点は、すべての3つのギレイヤーレイヤーが審美的にcolorの美学を持っていることですが、最初の2つだけがshapeの審美性を持ち、最後のレイヤーは美しさがlinetypeです。だからggplotへのscale_xx_manual()の追加がすべて正しく設定されていても、凡例は1つに結合されません。

私は長い間このことに執着していますので、どんな助けでも大歓迎です。ありがとう

答えて

3

マニュアルのカラースケールを作成するだけで、プロットとガイドの両方の色が変わります。一般的には、ガイド値をオーバーライドする際にスケールを使用することを常に推奨します。これは、ガイドに間違いを付けて視覚化の原因となるリスクを排除するためです。

ggplot(df) + 
    geom_point(aes(x, value, colour = variable, shape = variable), size = 3) + 
    geom_line(aes(x, log2, color = "log2(x)"), size = 1.5) + 
    scale_color_manual(values = c("a" = "gray40", "b" = "gray70", "log2(x)" = "cadetblue2")) + 
    guides(shape = FALSE, 
     colour = guide_legend(override.aes = list(shape = c(16, 17, NA), 
                linetype = c("blank", "blank", "solid")))) 

編集:ここでは

も形状のガイドオーバーライドをやって回避したバージョンです:

ggplot(df) + 
    geom_point(aes(x, value, colour = variable, shape = variable, linetype = variable), size = 3) + 
    geom_line(aes(x, log2, color = "log2(x)", linetype = "log2(x)", shape = "log2(x)"), size = 1.5) + 
    scale_color_manual(values = c("a" = "gray40", "b" = "gray70", "log2(x)" = "cadetblue2")) + 
    scale_shape_manual(values = c("a" = 16, "b" = 17, "log2(x)" = NA)) + 
    scale_linetype_manual(values = c("a" = "blank", "b" = "blank", "log2(x)" = "solid")) 

ggplot名、ラベル、および方向が同一である場合に自動的に伝説を結合しますが(12)、 "a"、 "b"、 "log2(x)"のすべてが同じ順序で各審美的にマッピングされていることを確認するだけです。この場合、レイヤーに不要なマッピングを追加し、警告を無視することでこれを実現します。

+0

ありがとうございました!他の2つの美学の1つではなく、「形状=偽」を選択する理由を説明できますか? –

+0

@AddisonKlinkeそのバージョンでは、2つのうちどれをfalseに設定してもかまいませんし、両方を同じ値に設定することもできます(つまり、 'guide_legend(...)')。彼らは同一で合併するだろう)。線種はプロット内の何にもマッピングされないため、凡例を取得しないため、設定する必要はありません。また、 'guides()'を全く使わない別の解決法がある私の編集をチェックしてください –

関連する問題