Rで最も特徴的な色の数を生成する方法は?


130

カテゴリカルデータセットをプロットしていて、異なるカテゴリを表すために独特の色を使用したいと思います。数を指定してnnRで最も特徴的な色の数を取得するにはどうすればよいですか?ありがとう。



回答:


108

RColorBrewerパッケージからすべての定性的なパレットに参加しました。定性パレットは、それぞれX個の最も特徴的な色を提供することになっています。もちろん、それらを1つのパレットに混ぜると、同様の色になりますが、それが私が得ることができる最高の色です(74色)。

library(RColorBrewer)
n <- 60
qual_col_pals = brewer.pal.info[brewer.pal.info$category == 'qual',]
col_vector = unlist(mapply(brewer.pal, qual_col_pals$maxcolors, rownames(qual_col_pals)))
pie(rep(1,n), col=sample(col_vector, n))

colour_Brewer_qual_60

その他の解決策は、グラフィックデバイスからすべてのR色を取り出し、それらからサンプリングすることです。グレーのシェードは似すぎているので削除しました。これは433色を与えます

color = grDevices::colors()[grep('gr(a|e)y', grDevices::colors(), invert = T)]

20色セット

pie(rep(1,n), col=sample(color, n))

200色n = 200

pie(rep(1,n), col=sample(color, n))

200色セット


16進コードcolを対応するカラー名に変換する可能性はありますか?
プラデープ2017

@Prradep colどういう意味?colorグラフィカルなデバイスからは名前を持っています。あなたは色の名前を対応している一般的ではなく、すべての16進コードの意味場合(のみ433の色があるgrDevicesが、さらに多くの16進コード)
JelenaČuklinaは、

私は約言及していますcol=sample(col_vector, n)からRColorBrewer、あなたのコードスニペットにパッケージ。たとえば、#B3E2CD, #E78AC3, #B3DE69から入手できるの色名を見つける方法 sample(col_vector,3)。または、brewer.pal関数によって指定されたすべての16進コードとその色名を見つける方法。
プラデープ2017

2
@Prradep、RColorBrewerパレットはgrDevices色から派生したものではなく、名前がマップされているが、16進コードにすぎないため、私の知る限り、これをRColorBrewerパレットで行うことはできません。
JelenaČuklina

1
@ytuの場合、色は区別できません。どうしても必要な場合は、Rで「グラデーション作成」を探し、色のランダムサンプリングを使用することをお勧めします。しかし、色から因子へのマッピングは機能せず、人間の知覚はおそらく20〜40色を処理でき、残りはそれほど大きくは異なりません。
JelenaČuklina

70

ここにいくつかのオプションがあります:

  1. palette関数を見てください:

     palette(rainbow(6))     # six color rainbow
     (palette(gray(seq(0,.9,len = 25)))) #grey scale
  2. そしてcolorRampPalette機能:

     ##Move from blue to red in four colours
     colorRampPalette(c("blue", "red"))( 4) 
  3. colorBrewerパッケージ(およびWebサイト)を見てください。発散する色が必要な場合は、サイトで発散を選択ます。例えば、

     library(colorBrewer)
     brewer.pal(7, "BrBG")
  4. 私が欲しい色相のウェブサイトでは、素敵なパレットの多くを提供します。ここでも、必要なパレットを選択します。たとえば、サイトからRGBカラーを取得して、独自のパレットを作成できます。

     palette(c(rgb(170,93,152, maxColorValue=255),
         rgb(103,143,57, maxColorValue=255),
         rgb(196,95,46, maxColorValue=255),
         rgb(79,134,165, maxColorValue=255),
         rgb(205,71,103, maxColorValue=255),
         rgb(203,77,202, maxColorValue=255),
         rgb(115,113,206, maxColorValue=255)))

ご回答有難うございます。それは色を生成しますが、いくつかは互いに非常に独特ではありません。多分私は私の質問でそれについてもっと強調するべきでした。
RNA

1
@RNAer回答を更新しました。提案3と4を使用して、パレットを分岐させることができます。
csgillespie 2013年

1
I want hue素晴らしいウェブサイトです。これがまさに私が欲しいものです。与えられた数、色の数のパレットを生成する方法。しかし、Rで自動的に実行できますか?
RNA

すばらしい。ただし、そのWebサイトの背後には多くの機構があります。再実装するのは簡単なことではないと思います。i want hue自動的にクエリを実行できるAPIがあればいいでしょう(多分そうです-私は長い間調べていませんでした)
Ben Bolker

8
@BenBolker -私はのRバージョンの要旨を作ったi want hueここに。効率は改善できます(たとえば、カラーサンプルをデータオブジェクトとして保存することにより)が、一般的な考え方はそこにあります。(をロードdevtools::source_gist('45b49da5e260a9fc1cd7')
jbaums 2014年

36

randomcoloRパッケージを試すこともできます

library(randomcoloR)
n <- 20
palette <- distinctColorPalette(n)

(ここの他の回答で示唆されているように)円グラフで視覚化すると、一連の非常に異なる色が選択されていることがわかります。

pie(rep(1, n), col=palette)

ここに画像の説明を入力してください

50色の円グラフで表示:

n <- 50
palette <- distinctColorPalette(n)
pie(rep(1, n), col=palette)

ここに画像の説明を入力してください


3
ありがとう。私はunname(distinctColorPalette(n))これをggplotで動作させるために使用しなければなりませんでした。ggplotには名前のないベクトルが必要だと思います。 col_vector <- unname(distinctColorPalette(n))その後... + scale_color_manual(values=col_vector) ...
ガウラヴ2017

19

OPの質問への回答ではありませんが、viridisシーケンシャルデータに適したカラーパレットを持つパッケージがあることは言及する価値があります。それらは、知覚的に均一で、色盲で安全で、プリンタに優しいものです。

パレットを取得するには、パッケージをインストールして関数を使用しますviridis_pal()。「A」、「B」、「C」、「D」の4つのオプションから選択できます

install.packages("viridis")
library(viridis)
viridis_pal(option = "D")(n)  # n = number of colors seeked

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

YouTubeには優れたカラーマップの複雑さを説明するすばらしい講演もあります。

Matplotlibのより良いデフォルトのカラーマップ| SciPy 2015 | ナサニエル・スミスとステファン・ファン・デル・ウォルト


17
これは独特の色にはあまり適していません。
クリストファージョン

13

colorRampPaletteベースまたはRColorBrewerパッケージから使用できます。

ではcolorRampPalette、次のように色を指定できます。

colorRampPalette(c("red", "green"))(5)
# [1] "#FF0000" "#BF3F00" "#7F7F00" "#3FBF00" "#00FF00"

または、16進コードを指定することもできます。

colorRampPalette(c("#3794bf", "#FFFFFF", "#df8640"))(5)
# [1] "#3794BF" "#9BC9DF" "#FFFFFF" "#EFC29F" "#DF8640"
# Note that the mid color is the mid value...

ではRColorBrewer、あなたは、既存のパレットから色を使用することができます。

require(RColorBrewer)
brewer.pal(9, "Set1")
# [1] "#E41A1C" "#377EB8" "#4DAF4A" "#984EA3" "#FF7F00" "#FFFF33" "#A65628" "#F781BF"
# [9] "#999999"

RColorBrewer他の利用可能なパレットについてはパッケージを見てください。お役に立てれば。


1
ありがとう。私は最後のオプションが好きbrewer.palです。しかし、それは9色までに制限されています。私は実際には9つ以上のカテゴリがあります。最初の選択肢はグラデーション色を生成しますが、これは私が望むほど独特ではありません。
RNA

2
多くの「異なる」色を選択することはできません。あなたは私が仮定する最大12を得ることができます。colorbrewer2.orgをチェックして色を取得する必要があります(私が正しい場合は、1〜12のカラーパレットがあります)。
アルン

12を超える独特のコロウトを探すのは難しいでしょう。カラーブリューアーのページでそれについての議論があると思います
alexwhan

それらが利用可能な「最も」独特の色である限り、それは問題ありません、それらは数が増えるとあまり目立たなくなります。
RNA

3
隣接するカテゴリに割り当てられたときに問題が隣り合った色で並んでいる場合(レインボーパレットのように)、レインボー出力を次のようにランダム化することができます:rainbow(n = 10)[sample(10)]
デビッドロバーツ

11

大きなカラーパレットには外部ソースを使用することをお勧めします。

http://tools.medialab.sciences-po.fr/iwanthue/

さまざまなパラメータに従って任意のサイズのパレットを作成するサービスがあり、

/graphicdesign/3682/where-can-i-find-a-large-palette-set-of-contrasting-colors-for-coloring-many-d/3815

グラフィックデザイナーの観点から一般的な問題について説明し、使用可能なパレットの例を数多く示します。

RGB値からパレットを構成するには、次の例のように、値をベクトルにコピーする必要があります。

colors37 = c("#466791","#60bf37","#953ada","#4fbe6c","#ce49d3","#a7b43d","#5a51dc","#d49f36","#552095","#507f2d","#db37aa","#84b67c","#a06fda","#df462a","#5b83db","#c76c2d","#4f49a3","#82702d","#dd6bbb","#334c22","#d83979","#55baad","#dc4555","#62aad3","#8c3025","#417d61","#862977","#bba672","#403367","#da8a6d","#a79cd4","#71482c","#c689d0","#6b2940","#d593a7","#895c8b","#bd5975")

3

20の異なる色のリストを提供するウェブサイトを見つけました:https : //sashat.me/2017/01/11/list-of-20-simple-distinct-colors/

col_vector<-c('#e6194b', '#3cb44b', '#ffe119', '#4363d8', '#f58231', '#911eb4', '#46f0f0', '#f032e6', '#bcf60c', '#fabebe', '#008080', '#e6beff', '#9a6324', '#fffac8', '#800000', '#aaffc3', '#808000', '#ffd8b1', '#000075', '#808080', '#ffffff', '#000000')

ぜひお試しください!


1
これは、n 明確な色のセットではなく、特徴的な色を生成することに関する質問には実際には答えません。回答を更新してみてください
Michal

1

次のような色のセットを生成できます。

myCol = c("pink1", "violet", "mediumpurple1", "slateblue1", "purple", "purple3",
          "turquoise2", "skyblue", "steelblue", "blue2", "navyblue",
          "orange", "tomato", "coral2", "palevioletred", "violetred", "red2",
          "springgreen2", "yellowgreen", "palegreen4",
          "wheat2", "tan", "tan2", "tan3", "brown",
          "grey70", "grey50", "grey30")

これらの色は可能な限り区別されます。それらの類似した色については、それらがグラデーションを形成するので、それらの間の違いを簡単に見分けることができます。


0

私の理解では、特徴的な色の検索は、立方体の3次元が赤、緑、青の軸に沿った3つのベクトルである単位立方体からの効率的な検索に関連しています。これは、彩度(S)と値(V)を修正し、ランダムな色相値を見つけるシリンダー(HSVの類推)で検索するように簡略化できます。それは多くの場合に機能し、これをここで見てください:

https://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/

Rでは、

get_distinct_hues <- function(ncolor,s=0.5,v=0.95,seed=40) {
  golden_ratio_conjugate <- 0.618033988749895
  set.seed(seed)
  h <- runif(1)
  H <- vector("numeric",ncolor)
  for(i in seq_len(ncolor)) {
    h <- (h + golden_ratio_conjugate) %% 1
    H[i] <- h
  }
  hsv(H,s=s,v=v)
}

別の方法は、Rパッケージを「均一に」使用することです https://cran.r-project.org/web/packages/uniformly/index.html

そしてこのシンプルな関数は独特の色を生成することができます:

get_random_distinct_colors <- function(ncolor,seed = 100) {
  require(uniformly)
  set.seed(seed)
  rgb_mat <- runif_in_cube(n=ncolor,d=3,O=rep(0.5,3),r=0.5)
  rgb(r=rgb_mat[,1],g=rgb_mat[,2],b=rgb_mat[,3])
}

grid-searchにより、もう少し複雑な機能を考えることができます。

get_random_grid_colors <- function(ncolor,seed = 100) {
  require(uniformly)
  set.seed(seed)
  ngrid <- ceiling(ncolor^(1/3))
  x <- seq(0,1,length=ngrid+1)[1:ngrid]
  dx <- (x[2] - x[1])/2
  x <- x + dx
  origins <- expand.grid(x,x,x)
  nbox <- nrow(origins) 
  RGB <- vector("numeric",nbox)
  for(i in seq_len(nbox)) {
    rgb <- runif_in_cube(n=1,d=3,O=as.numeric(origins[i,]),r=dx)
    RGB[i] <- rgb(rgb[1,1],rgb[1,2],rgb[1,3])
  }
  index <- sample(seq(1,nbox),ncolor)
  RGB[index]
} 

この機能を確認するには:

ncolor <- 20
barplot(rep(1,ncolor),col=get_distinct_hues(ncolor))          # approach 1
barplot(rep(1,ncolor),col=get_random_distinct_colors(ncolor)) # approach 2
barplot(rep(1,ncolor),col=get_random_grid_colors(ncolor))     # approach 3

ただし、人間が知覚できる色で明確なパレットを定義することは簡単ではないことに注意してください。上記のアプローチのどれが多様なカラーセットを生成するかはまだテストされていません。


0

この目的には、Polychromeパッケージを使用できます。色の数と数が必要seedcolorsです。例えば:

# install.packages("Polychrome")
library(Polychrome)

# create your own color palette based on `seedcolors`
P36 = createPalette(36,  c("#ff0000", "#00ff00", "#0000ff"))
swatch(P36)

このパッケージの詳細については、https://www.jstatsoft.org/article/view/v090c01をご覧ください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.