web-dev-qa-db-ja.com

ggplot2のscale_fill_brewerの1つの値の色の値を変更するにはどうすればよいですか?

Ggplot2に棒グラフとしてプロットしているRデータフレーム(df)があり、データフレーム(df$type)の列に基づいて色付けしています。現在、デフォルトのカラーパターン(scale_fill_brewer)を使用して色を割り当てています。

黒を1つの値(df$type == -1)に割り当て、scale_fill_brewerを使用して残りの色を割り当てるにはどうすればよいですか? (他のすべてのdf$typesは、1からXまでの整数のセット内にあります。Xは一意の値の数です)

これまでのところ、scale_fill_brewerがN個の異なるアイテムに使用する色のセットを把握し、それを黒のふりをしてscale_fill_manualに渡すことで、これを手動で行うことができました。

rhg_cols1<- c("#000000","#F8766D","#7CAE00","#00BFC4","#C77CFF" )
ggplot(y=values,data=df, aes(x=name, fill=factor(type))) + 
  geom_bar()+ scale_fill_manual(values = rhg_cols1)

問題は、16進カラー計算機を使用してscale_fill_brewerの16進値を計算することにより、手動で色を割り当てることなく機能するソリューションが必要なことです。

何かのようなもの:

ggplot(y=values,data=df, aes(x=name, fill=factor(type))) +
  geom_bar()+ scale_fill_brewer(value(-1, "black")

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

編集:ソリューションは30色以上で機能し、ColorBrewerの「Set2」で機能する必要があります

21
wespiserA

パッケージRColorBrewerにはパレットが含まれており、関数brewer.palを使用して選択したカラーパレットを返すことができます。

たとえば、5色の連続した青いパレット:

library(RColorBrewer)
my.cols <- brewer.pal(5, "Blues")
my.cols

[1] "#EFF3FF" "#BDD7E7" "#6BAED6" "#3182BD" "#08519C"

有効なパレット名のリストは、?brewer.palヘルプファイルで入手できます。これらの名前は、 ColorBrewer Webサイトの名前に対応しています。

これで、結果を使用または変更し、提案したようにscale_manual_fillを使用してこれらをggplotに渡すことができます。

my.cols[1] <- "#000000"

library(ggplot2)
df <- data.frame(x=1:5, type=1:5)
ggplot(df, aes(x=x, fill=factor(type))) +
    geom_bar(binwidth=1)+ 
    scale_fill_manual(values = my.cols)

enter image description here

36
Andrie

この多くの(30以上の)異なるカテゴリを区別する必要がある場合は、バックアップして、プロジェクトについて戦略的に考えるためにもう少し時間を費やす必要があります。30色のセットを思い付くのはほぼ不可能です。実際に区別できます(特にプラットフォーム/レンダリングチャネルに依存しない方法で)。

基本的に、_Set2_および30以上の色で機能するソリューションはありません。一部のCBパレット(_Set3_およびPaired; library(RColorBrewer); display.brewer.all(n=12))では、最大12色を使用できます。

編集:OPは、カテゴリが多数ある場合でも壊れない、優れた識別可能な色を使用して探索的データ分析を実行したいと考えています。私はこれらの線に沿って何かを提案します:

_library(RColorBrewer)
my.cols <- function(n) {
  black <- "#000000"
  if (n <= 9) {
    c(black,brewer.pal(n-1, "Set2"))
  } else {
    c(black,hcl(h=seq(0,(n-2)/(n-1),
                  length=n-1)*360,c=100,l=65,fixup=TRUE))
  }
}

library(ggplot2)
d <- data.frame(z=1:10)
g1 <- qplot(z,z,data=d,colour=factor(z))+opts(legend.position="none")
g1 + scale_colour_manual(values=my.cols(9))
g1 + scale_colour_manual(values=my.cols(10))
## check that we successfully recreated ggplot2 internals
## g1+scale_colour_discrete()
_

これはかなりうまくいくと思います(必要に応じて、_Set3_と13色のカットオフに置き換えることができます)。 (私が考えることができる)唯一の欠点は、9色と10色のプロット間の不連続性です。

プログラム的な方法でN個の識別可能な色のセットを選択するためのより良い解決策を思い付くのはかなり難しいでしょう...

20
Ben Bolker