2016-05-17 49 views
8

ggplot2でリボンをカラーリングしようとしています。 geom_ribbonを使用する場合は、yminとymaxと塗りつぶしの色を指​​定できます。現在は、yminとymaxの間にあるすべてのものに、上限または下限に関係なく着色しています。 (インターネットから変更)ggplot2:geom_ribbonの色の動作を塗りつぶします

例:

library("ggplot2") 
# Generate data (level2 == level1) 
huron <- data.frame(year = 1875:1972, level = as.vector(LakeHuron), level2 = as.vector(LakeHuron)) 

# Change Level2 
huron[1:50,2] <- huron[1:50,2]+100 
huron[50:90,2] <- huron[50:90,2]-100 

h <- ggplot(huron, aes(year)) 

h + 
    geom_ribbon(aes(ymin = level, ymax = level2), fill = "grey80") + 
    geom_line(aes(y = level)) + geom_line(aes(y=level2)) 

このチャートになります: enter image description here

私は異なる色で、領域、(YMIN> YMAX)を充填したいです(ymin < ymax)よりも大きい。私の実際のデータには、輸出と輸入の価値があります。そこでは、輸出が輸入グリーンより高い地域を色付けしたいと思います。輸入が輸出よりも大きいのは、リボンを赤にしたいのです。

代替:私は、geom_ribbonに領域を塗りつぶしたいと思います。ここで、ymax> yminです。

これはどのように行われたのですか?

ありがとうございました。

答えて

7

別の列を手動で作成する必要がないオプションは、aes(fill =内のロジックを実行することです。

## fill dependent on level > level2 
h + 
    geom_ribbon(aes(ymin = level, ymax = level2, fill = level > level2)) + 
    geom_line(aes(y = level)) + geom_line(aes(y=level2)) + 
    scale_fill_manual(values=c("red", "green"), name="fill") 
filled conditional on level > level2

それとも、あなただけの、真であることという条件に基づいて記入したい場合は

## fill dependent on level > level2, no fill otherwise 
h + 
    geom_ribbon(aes(ymin = level, ymax = level2, fill = ifelse(level > level2, TRUE, NA))) + 
    geom_line(aes(y = level)) + geom_line(aes(y=level2)) + 
    scale_fill_manual(values=c("green"), name="fill") 

filled conditional on level > level2, not otherwise

私は補間塗りつぶしの欠如を前提とは何かを持っているようですggplot2のバージョンとは、@ beetrootのコードで同じことが起こるので、

## @beetroot's answer 
huron$id <- 1:nrow(huron) 
huron$group <- ifelse(huron$id <= 50, "A", "B") 

h <- ggplot(huron, aes(year)) 
h + 
    geom_ribbon(aes(ymin = level, ymax = level2, fill = group)) + 
    geom_line(aes(y = level)) + geom_line(aes(y = level2))  

@beetroot's answer

aes(fill =内のロジックなしでそのコードを実行しているとき、私はManuKの画像出力@得ます。

+0

これは素晴らしいです、ありがとうございます!私が欲しかったのは基本的に条件を 'fill ='に入れることができるからです。しかし、私は完全ではないので私の変更要求を開いたままにしておきます:充填は交差点に完全には適用できません。 (今回は私にとっては問題ありません)また、ggplot2の充てんロジックを変更する必要があると私はまだ考えています。 – ManuK

+0

スーパーに役立つ!長い形式のデータで同じ結果を達成する方法はありますか?たとえば、データをYear、Level(1または2)、Valueとして設定します。 h + geom_line(aes(y = Value、group = Level))までは取得できますが、この構造体でgeom_ribbon()レイヤーを追加する方法を見つけることはできません。 –

+1

簡単にはありません。 'ggplot2'は列を期待するので、' ymin'と 'ymax'の値として使うカラムが必要です。長いデータを必要なフォーマットに' tidyr :: spread() 'するのはかなり簡単です。 –

5

塗りつぶしの色を指​​定するために使用できるデータにグループ化変数を追加できます。しかし、問題は、2つの線が交わる点であり、ギャップを防ぐために両方のグループに含まれる必要があるからです。

だから、最初にこの行に..

huron[huron$level == huron$level2,] 

> huron[huron$level == huron$level2,] 
    year level level2 
50 1924 577.79 577.79 
... 

を見つけて、もう一度データに追加します。

huron <- rbind(huron, huron[huron$year == 1924,]) 
huron <- huron[order(huron$year),] 

次に行インデックスに基づいて、id列を追加し、ベースのグループを設定します

huron$id <- 1:nrow(huron) 
huron$group <- ifelse(huron$id <= 50, "A", "B") 

h <- ggplot(huron, aes(year)) 
h + 
    geom_ribbon(aes(ymin = level, ymax = level2, fill = group)) + 
    geom_line(aes(y = level)) + geom_line(aes(y = level2)) 

enter image description here

:1924年の行番号に
+0

ご回答ありがとうございます。しかし私のusecaseでは、以下の問題のためにあまり使用できません。 1.複数のリボンを追加したいので、かなりの数の回避策の列を追加する必要があります。 2.線が交差する点は実際にデータ内に見えないので、これらの点を計算してデータベースに追加する必要があります(2回)。私は簡単な解決策を望んでいますが、簡単な条件付き入力よりも複雑に思えます。 :-) – ManuK

+0

@ManuKはい、特に2.私が知っている限り問題を解決するのは難しく、残念ながら私は現時点であなたを助けることはできません。しかし、他の誰かが別の答えを思いつくだろうか?たぶん[this](https://learnr.wordpress.com/2009/10/22/ggplot2-two-color-xy-are-combo-chart/)ブログ記事はあなたにいくつかのアイデアを提供します – beetroot

+0

私は機能として問題を提出しましたggplot2 githubにリクエストしてください。 ggplot2の将来のリリースで実装されることを願っています(リクエストへのリンク)(https://github.com/hadley/ggplot2/issues/1642) – ManuK

1

私はfill非補間としていた問題を中心に取得、あなたが2つ(またはn)リボン

h <- ggplot() + 
    geom_ribbon(data = huron[huron$level >= huron$level2, ], aes(x = year, ymin = level, ymax = level2), fill="green") + 
    geom_ribbon(data = huron[huron$level <= huron$level2, ], aes(x = year, ymin = level, ymax = level2), fill="red") + 
    geom_line(data = huron, aes(x = year, y = level)) + 
    geom_line(data = huron, aes(x = year, y = level2)) 
h 

Fill is interpolated now

あなたはaes(fill =で使用するすべての条件を使用することができますし、それを強制しようとしています実際のところどこにデータが当てはまるように見えますか?私はこれがggplot2バグだとは思わないが、これは予想される動作だと思う。

関連する問題