2016-11-23 12 views
0

値がゼロ未満のときにバーが赤くなるようにします。これは、私が働いている実際のデータはありませんが、私は、これは再生可能な例を作成ことを願っています:データセットの値に基づいてgeom_barsに色付けする

library(ggplot2) 
library(car) 

mtcars$carnames <- rownames(mtcars) 
rownames(mtcars) <- 1:nrow(mtcars) 

subsetCars <- as.data.frame(head(mtcars, n = 20)) 
subsetCars[1,4] <- -50 

myplot.p <- ggplot(subsetCars, aes(x = subsetCars$carnames, y = subsetCars$hp)) 
myplot.p + geom_bar(stat = 'identity', 
        fill = ifelse(subsetCars$hp > 0, "lightblue", "firebrick")) + 
    coord_flip() 

link to cars barplot

1つのバーが赤く着色されているが、負の値を持つていない1。私も同様の問題を抱えています。 アドバイス?

+0

私にとってはうまく動作します。ただし、 'data'パラメータを指定している場合は' aes'で '$'サブセットを使う必要はありません。裸の変数名を入れてください。 – alistaire

+0

編集ありがとう!まだ画像を投稿できないので、リンクを提供する必要がありました。 –

答えて

2

geom_barfill引数には、ifelseで作成されたベクトルが使用されます。最初の要素は「firebrick」で、その他の要素はすべて「lightblue」です。最初の(一番下の)バーは赤で塗りつぶされます。しかし、最初のバーは負の値の行に対応していません。なぜなら、観測結果はアルファベット順にcarnamesで並べ替えられているからです。 @alistaireが指摘したように$サブセットは、不要であり、fill美的はggplot()に述べることができる場所をご希望のグラフをプロットする

Aより多くの慣用的な方法は、

myplot.p <- ggplot(subsetCars, aes(x = carnames, y = hp, fill = hp < 0)) 
myplot.p + geom_bar(stat = 'identity') + 
    scale_fill_manual("Negative hp", values = c("lightblue", "firebrick")) + 
    coord_flip() 

です。

enter image description here

+0

私は理解していると思います。 Scale_fillは実際にエース内の塗りつぶし宣言を検索し、その引数と値の中の引数に基づいて塗りつぶしを変更していますか? –

+0

これは正しい考えです。 –

0

あなたが持っている問題は、塗りつぶしを指定する際に、ggplotはそれが名前のためであるのと同じ順序でその美的を割り当てていないことです。したがって、順序が保持されていることを確認するには、ゼロより大きい変数を他の美学と一緒に配置する必要があります。

この不都合な副作用は、手動で色を設定して塗り潰しの凡例を削除する必要があることです。

ggplot(subsetCars, aes(x = subsetCars$carnames, y = subsetCars$hp, 
fill = hp > 0)) + 
geom_bar(stat = 'identity') + 
coord_flip() + 
scale_fill_manual(values = c("TRUE" = "lightblue", 
"FALSE" = "firebrick")) + 
theme(legend.position = "none") 

私は助けてくれることを望みます!

+0

両方の答えが機能します!ありがとうございました。残念ながら、私の担当者は答えに投票するには低すぎます。 –

関連する問題