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」で機能する必要があります
パッケージ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)
この多くの(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個の識別可能な色のセットを選択するためのより良い解決策を思い付くのはかなり難しいでしょう...