web-dev-qa-db-ja.com

ggplotの1本の棒のみの色を変更する

Ggplotで1つのバーのみを着色したい。これは私のデータフレームです:

area <- c("Północ", "Południe", "Wschód", "Zachód")
sale <- c(16.5, 13.5, 14, 13)
df.sale <- data.frame(area, sale)
colnames(df.sale) <- c("Obszar sprzedaży", "Liczba sprzedanych produktów (w tys.)")

そしてプロットのためのコード:

plot.sale.bad <- ggplot(data=df.sale, aes(x=area, y=sale, fill=area)) +
  geom_bar(stat="identity") +
  scale_fill_manual(values=c("black", "red", "black", "black")) +
  xlab(colnames(df.sale)[1]) +
  ylab(colnames(df.sale)[2]) +
  ggtitle("Porównanie sprzedaży") 

バーを1つだけ色付けし、他の3つをデフォルトの色にしたい(黒ではなくダークグレー、見た目が悪い)。棒の色だけを変更したり、棒のデフォルトの色の名前を取得して、黒ではなくそれらを配置するにはどうすればよいですか?

14
jjankowiak

オプション1:1つのバーのみの色を変更します。ヘンリックの提案に従って、デフォルトの色のNAとデフォルト以外の色の文字列/係数(最初の色はたまたま赤)を持つ新しい変数を作成できます。

area.color <- c(NA, "withcolor", NA, NA)
plot.sale.bad <- ggplot(data=df.sale, aes(x=area, y=sale, fill=area.color)) +
  geom_bar(stat="identity") +
  xlab(colnames(df.sale)[1]) +
  ylab(colnames(df.sale)[2]) +
  ggtitle("Porównanie sprzedaży") 
plot.sale.bad

オプション2:希望するデフォルトの濃い灰色の名前を見つけます。元のコードのscale_fill_manual行を削除するだけの場合、これはデフォルトの色ではないため(この場合、4つの異なるパステルが表示されます)、この段落のすぐ上のコードチャンクによって生成された灰色を意味していると思います、area.color==NAのバーの場合。その場合、scale_fill_discreteのソースコード(またはargs)を確認できます。

> args(scale_fill_discrete)
# function (..., h = c(0, 360) + 15, c = 100, l = 65, h.start = 0, 
#     direction = 1, na.value = "grey50") 
# NULL

na.valueのデフォルトは"grey50"です。したがって、scale_fill_manualを使用したい場合は、次のようにすることができます。

plot.sale.bad <- ggplot(data=df.sale, aes(x=area, y=sale, fill=area)) +
  geom_bar(stat="identity") +
  scale_fill_manual(values=c("grey50", "red", "grey50", "grey50")) +
  xlab(colnames(df.sale)[1]) +
  ylab(colnames(df.sale)[2]) +
  ggtitle("Porównanie sprzedaży") 
plot.sale.bad
17
pangia

すべてをggplot呼び出しに含める場合は、以下に示すように、factor()内でifelseステートメントを使用して塗りつぶします。

これにより、凡例も2つのカテゴリ(強調表示と非強調表示)に分けられるため、x軸に表示されている値が繰り返されなくなります。これは、凡例のプロットに別の例示的な次元も提供します。

_plot.sale.bad2 <- ggplot(data=df.sale,
                         aes(x=area,
                             y=sale,
                             fill=factor(ifelse(area=="Południe","Highlighted","Normal")))) +
  geom_bar(stat="identity") +
  scale_fill_manual(name = "area", values=c("red","grey50")) +
  xlab(colnames(df.sale)[1]) +
  ylab(colnames(df.sale)[2]) +
  ggtitle("Porównanie sprzedaży") 

plot.sale.bad2
_

Plot with legend

凡例が必要ない場合は、geom_boxplot()呼び出しに_show.legend = FALSE_を追加して、以下を作成できます。

Plot without legend

9
Russ Thomas