2016-12-11 9 views
0

特定のプロットに関する質問があります。私は、次のdata.frame持って考えてみましょう:私は3つの多角形(X、A)、(X、D)、(X、e)をプロットしたいggplot2で特定の行と1つの凡例を表示する

data <- data.frame(a = c(44, 58, 60, 63, 65, 66, 67, 68, 69, 70), 
       b = c(38, 52, 55, 57, 59, 60, 61, 62, 63, 65), 
       c = c(51, 64, 66, 68, 70, 71, 71, 73, 74, 75), 
       d = c(44, 53, 54, 55, 56, 56, 58, 59, 59, 60), 
       e = c(44, 57, 59, 60, 62, 63, 64, 65, 66, 67), 
       x = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)) 
rownames(data) = c('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J') 

を三つの異なる線種 '固体'、 ' 「ダッシュ」と「ダッシュ」。彼らはすべて伝説に登場するはずです。私はポリゴン(x、b)、(x、c)を線種「点線」でプロットし、それらの間に赤を配置したいと思う。赤い領域のみが凡例に表示されますが、点線自体は表示されません。これを行うには、次のコード行を書きました。

data_no_legend = data[,c(2,3,6)] 
data_legend = data[,c(1,4,5,6)] 

data_melt_legend = melt(data_legend, id = "x") 
data_melt_no_legend = melt(data_no_legend, id = "x") 

p <- ggplot() 
p <- p + geom_ribbon(data = data, aes(x = x, ymin = b, ymax = c,fill = 'legend'), alpha = 0.5, show.legend = TRUE, inherit.aes = FALSE) 
p <- p + scale_fill_manual(labels = c("legend"), values = c('red')) 
p <- p + geom_line(data = data_melt_legend, aes(x = x, y = value, size = variable, linetype= variable), color = 'gray', show.legend = TRUE, inherit.aes=FALSE) 
p <- p + scale_linetype_manual(labels = c("legend 1","legend 2", "legend 3"),values = c("solid","dashed", "dotdash")) 
p <- p + scale_size_manual(labels = c("legend 1","legend 2", "legend 3"),values = c(1,0.5,0.5)) 
p <- p + geom_line(data = data_melt_no_legend, aes(x = x, y = value, group= variable), color= 'gray', linetype = 'dotted', show.legend = FALSE, inherit.aes=FALSE) 
p <- p + geom_point(data=data, aes(x = x, y = a), color = 'gray', size = 1.5,inherit.aes=FALSE) 

残念ながら私は2つの異なる伝説を持っています。 1つはライン用、もう1つはエリア用です。誰か助けてくれますか?ありがとうございました!

+0

私はあなたの 'x'カラムに9が足りないと思います。また、 'data_melt_index'と' data_melt_no_index'はどこにもありません。それぞれ 'data_melt_legend'と' data_melt_no_legend'を意味しますか? – useR

+1

"記入欄"の凡例を削除するか、それを凡例と組み合わせようとしていますか?後者の場合、4番目のキーを追加するだけでいいですか、「凡例1」、「凡例2」、「凡例3」をすべて背景にするようにしますか? – useR

+0

私はそれを行の凡例と組み合わせて、四つ目のキーとして色付けされた領域を追加したいと思います。 –

答えて

0

申し訳ありませんが、これは少しやっていましたが、これはうまくいくと思います。私は凡例に表示しようとしていることを示す "Legend"という名前の新しい列を生成しています(したがって、おそらくそれを更新したいと思うでしょう)。私はこのデータフォーマットを生成するためにの代わりにtidyverseからgatherを使用し、dplyrmutateを使用しています。

次に、ラインをgeom_lineにしたい値を含む線種を設定する必要があるということです。私は、ラインの二重印刷を避けるために、サイズを0に設定しました。次に、ラインを追加して、印刷したい美学を設定します。最終的なトリックはoverride.aesを使用して、線の後ろの塗りの色を変更します(基本的にgeom_ribbonグループに追加します)。塗りつぶしの別の凡例を抑制します。show.legend = FALSEを使用すると、塗りつぶしを設定しません。凡例もlinetype)。

gatheredData <- 
    data %>% 
    gather(variable, value, -x) %>% 
    mutate(Legend = ifelse(variable %in% c("b","c") 
         , "bc", variable) 
     , Legend = factor(Legend 
          , levels = c("a", "d", "e", "bc"))) 

ggplot() + 
    geom_ribbon(aes(x = x 
        , ymax = c 
        , ymin = b 
        , fill = "bc" 
        , linetype = factor("bc" 
             , levels = levels(gatheredData$Legend)) 
       ) 
       , data = data 
       , size = 0) + 
    geom_line(aes(x = x 
       , y = value 
       , linetype = Legend 
       , group = variable) 
      , gatheredData) + 
    scale_linetype_manual(values = c(a ='solid' 
            , d = 'dotdash' 
            , e = 'dashed' 
            , bc = 'dotted') 
         , name = "Legend" 
         , breaks = levels(gatheredData$Legend)) + 
    scale_fill_manual(values = c(bc = 'red') 
        , drop = FALSE) + 
    guides(
    linetype = guide_legend(override.aes = list(fill = c("gray", "gray", "gray", "red"))) 
    , fill = "none" 
    ) 

私は凡例項目の順序を設定する凡例レベルを使用

enter image description here

注意を与えます。それは何らかの理由で本当に厄介で、明示的にbreaks =と設定する必要がありました。

関連する問題