web-dev-qa-db-ja.com

Rの発散色の「良い」パレットとは何ですか? (または:viridisとマグマを一緒に組み合わせることができますか?)

「良い」発散カラーパレットに興味があります。赤、白、青だけを使用することもできます。

img <- function(obj, nam) {
  image(1:length(obj), 1, as.matrix(1:length(obj)), col=obj, 
        main = nam, ylab = "", xaxt = "n", yaxt = "n",  bty = "n")
}
rwb <- colorRampPalette(colors = c("red", "white", "blue"))
img(rwb(100), "red-white-blue")

enter image description here

私は最近 viridisカラーパレット に恋をしたので、ビリディとマグマを組み合わせてそのような発散色を形成することを望んでいました(もちろん、色覚異常の人は色の絶対値しか見ることができませんが、それは時々大丈夫です)。

Viridisとmagmaを組み合わせてみたところ、同じ場所で「終了」(または「開始」)しないことがわかったため、次のようになります(Rを使用していますが、これはおそらく同じです) python users):

library(viridis)
img(c(rev(viridis(100, begin = 0)), magma(100, begin = 0)), "magma-viridis")

enter image description here

ゼロに近づくと、ビリディは紫色になり、マグマは黒色になります。私はそれらの両方が(多かれ少なかれ)同じスポットで開始することを望んでいるので、開始点として0.3を使用してみました:

img(c(rev(viridis(100, begin = 0.3)), magma(100, begin = 0.3)), "-viridis-magma(0.3)")

enter image description here

これは確かに良いですが、もっと良い解決策があるかどうか疑問に思います。

(私は「タグ付け」もしていますpythonユーザー、viridisはもともとmatplotlibからのものなので、それを使用している誰かがそのような解決策を知っているかもしれません)

ありがとう!

26
Tal Galili

Kenneth Morelandの提案 は非常に役に立ちます。 Rgnuplotパッケージに実装されています(install.packages("Rgnuplot")で十分です。GNU plotをインストールする必要はありません)。通常の色のように使用するにはマップ、次のように変換する必要があります:

cool_warm <- function(n) {
  colormap <- Rgnuplot:::GpdivergingColormap(seq(0,1,length.out=n),
                                             rgb1 = colorspace::sRGB( 0.230, 0.299, 0.754),
                                             rgb2 = colorspace::sRGB( 0.706, 0.016, 0.150),
                                             outColorspace = "sRGB")
  colormap[colormap>1] <- 1 # sometimes values are slightly larger than 1
  colormap <- grDevices::rgb(colormap[,1], colormap[,2], colormap[,3])
  colormap
}

img(red_blue_diverging_colormap(500), "Cool-warm, (Moreland 2009)")

cool-warm colormap これは、補間されたRColorBrewer "RdBu"と比較した場合の動作を示しています。 comparison

11
jan-glx

すでにいくつかの優れた有用な提案がありましたが、いくつかの注釈を付け加えておきます。

  1. ビリディスパレットとマグマパレットは、複数の色相を持つ連続したパレットです。したがって、スケールに沿って、非常に明るい色からかなり暗い色に増加します。同時に色味が増し、色相が黄色から青に変化します(緑または赤)。
  2. 発散パレットは、2つの連続したパレットを組み合わせて作成できます。通常は、明るい色でそれらを結合してから、それらを別の暗い色に発散させます。
  3. 通常、ニュートラルライトグレーから2つの異なるダークカラーに分岐する単一色相の連続パレットを使用します。ただし、パレットのさまざまな「アーム」は、輝度(明暗)と彩度(彩度)のバランスが取れていることに注意する必要があります。

したがって、マグマとビリディスを組み合わせてもうまくいきません。あなたはそれらを同様の黄色がかった色から発散させることができますが、同様の青みがかった色に発散するでしょう。また、色相が変化すると、パレットのどの部分にいるかを判断するのが難しくなります。

他の人が述べたように、ColorBrewer.orgは優れた発散パレットを提供します。モアランドのアプローチも役に立ちます。さらに別の一般的な解決策は、colorspaceパッケージのdiverge_hcl()関数です。それはCSDAペーパー( http://dx.doi.org/10.1016/j.csda.2008.11.0 )で説明されており、気象学に向けられた、しかしそれ以上に適用可能なさらなる推奨事項は、 BAMS論文( http://dx.doi.org/10.1175/BAMS-D-13-00155.1 ).

HCL空間(色相-彩度-輝度)でのこのソリューションの利点は、座標を比較的簡単に解釈できることです。ある程度の練習は必要ですが、他のソリューションほど不透明ではありません。また、さまざまな座標の重要性を理解するのに役立つGUI hclwizard()(以下を参照)も提供しています。

2つの色相(引数h)、最大彩度(c)が提供されている場合、質問と他の回答のほとんどのパレットはdiverge_hcl()によってかなり厳密に一致できます。 、最小/最大輝度(l)が適切に選択されます。さらに、クロマとルミナンスの増加速度をそれぞれ制御するpower引数を微調整する必要がある場合があります。通常、彩度はかなり速く追加されますが(_power[1] < 1_)、輝度はゆっくりと増加します(_power[2] > 1_)。

たとえば、モアランドの「涼しい」パレットは、青(_h = 250_)と赤(_h = 10_)の色相を使用していますが、輝度コントラストは比較的小さいです(_l = 37_と_l = 88_)。 :

_coolwarm_hcl <- colorspace::diverge_hcl(11,
  h = c(250, 10), c = 100, l = c(37, 88), power = c(0.7, 1.7))
_

これは以下にかなり似ています(下記を参照)。

_coolwarm <- Rgnuplot:::GpdivergingColormap(seq(0, 1, length.out = 11),
  rgb1 = colorspace::sRGB( 0.230, 0.299, 0.754),
  rgb2 = colorspace::sRGB( 0.706, 0.016, 0.150),
  outColorspace = "sRGB")
coolwarm[coolwarm > 1] <- 1
coolwarm <- rgb(coolwarm[, 1], coolwarm[, 2], coolwarm[, 3])
_

対照的に、ColorBrewer.orgのBrBGパレットは、はるかに高い輝度コントラスト(_l = 20_対_l = 95_)です。

_brbg <- rev(RColorBrewer::brewer.pal(11, "BrBG"))
brbg_hcl <- colorspace::diverge_hcl(11,
  h = c(180, 50), c = 80, l = c(20, 95), power = c(0.7, 1.3))
_

結果のパレットは、元のパレットの下のHCLベースのバージョンと以下で比較されます。これらは同一ではなく、かなり近いことがわかります。右側では、ビリディスと血漿をHCLベースのパレットと組み合わせました。

palettes

冷温パレットとBrBGパレットのどちらを好むかは、個人の好みだけでなく、さらに重要なことに、視覚化で何を引き出したいかによって異なります。偏差のsignが最も重要である場合は、暖色系の低輝度コントラストがより役立ちます。 (極端な)偏差のsizeを引き出したい場合は、高輝度コントラストがより役立ちます。より実用的なガイダンスはBAMSペーパーにあり、計算はCSDAペーパーでより詳細に説明されています。

上の図の残りのレプリケーションコードは次のとおりです。

_viridis <- viridis::viridis(11)
viridis_hcl <- colorspace::heat_hcl(11,
  h = c(300, 75), c = c(35, 95), l = c(15, 90), power = c(0.8, 1.2))

plasma <- viridis::plasma(11)
plasma_hcl <- colorspace::heat_hcl(11,
  h = c(-100, 100), c = c(60, 100), l = c(15, 95), power = c(2, 0.9))

pal <- function(col, border = "transparent") {
  n <- length(col)
  plot(0, 0, type="n", xlim = c(0, 1), ylim = c(0, 1),
    axes = FALSE, xlab = "", ylab = "")
  rect(0:(n-1)/n, 0, 1:n/n, 1, col = col, border = border)
}

par(mar = rep(0, 4), mfrow = c(4, 2))
pal(coolwarm)
pal(viridis)
pal(coolwarm_hcl)
pal(viridis_hcl)
pal(brbg)
pal(plasma)
pal(brbg_hcl)
pal(plasma_hcl)
_

提案された色は、光沢のあるアプリ http://hclwizard.org:64230/hclwizard/ でインタラクティブに探索できます。 Rのユーザーは、コンピューターでローカルに光沢のあるアプリを起動することもできます(サーバーから実行するよりも少し高速です)、またはTcl/Tkバージョンを実行することもできます(さらに高速です)。

_colorspace::hclwizard(gui = "shiny")
colorspace::hclwizard(gui = "tcltk")
_

パレットのパスがRGBおよびHCL座標でどのように見えるかを理解したい場合は、colorspace::specplot()が役立ちます。たとえば、colorspace::specplot(coolwarm)を参照してください。

16
Achim Zeileis

scico パッケージ(Scientific Colour-Mapsに基づくRのパレット)には、知覚的に均一で色盲の安全ないくつかの優れた発散パレットがあります(例 vikromaberlin )。

Python、MatLab、GMT、QGIS、Plotly、Paraview、VisIt、Mathematica、Surfer、d3などでも利用できます。 here

Paper:Crameri、F.(2018)、地球力学診断、科学的可視化およびStagLab 3.0、Geosci。モデル開発、11、2541-2562、 doi:10.5194/gmd-11-2541-2018

Editscico がCRANに追加されました。 install.packages('scico')を実行してインストールします

# install.packages("devtools")
# devtools::install_github("thomasp85/scico")
library(scico)
scico_palette_show(palettes = c("broc", "cork", "vik",
                                "lisbon", "tofino", "berlin",
                                "batlow", "roma"))

別の素晴らしいパッケージは cmocean (Python)です。そのカラーマップはRで pals パッケージまたは oce パッケージを介して利用できます。

:Thyng、K. M.、Greene、C. A.、Hetland、R. D.、Zimmerle、H. M.&DiMarco、S. F.(2016)海洋学の本当の色。 Oceanography、29(3)、10 http://dx.doi.org/10.5670/oceanog.2016.66
トークPLOTCON 2016:Kristen Thyng、フィールドのカスタムカラーマップ

### install.packages("devtools")    
### devtools::install_github("kwstat/pals")   
library(pals)   
pal.bands(ocean.balance, ocean.delta, ocean.curl, main = "cmocean")   

Editrcartocolor パッケージからcolorblind対応のパレットを追加します

library(rcartocolor)
display_carto_all(type = 'diverging', colorblind_friendly = TRUE)

7
Tung

ライブラリRColorBrewerは、<< 13色の美しいパレットを提供します。たとえば、パレットBrBGは、茶色から緑色に発散する色を示します。

library(RColorBrewer)
display.brewer.pal(11, "BrBG")

enter image description here

これは、中間点カラーとの間でパレットを作成することにより、情報量の少ないパレットに拡張できます。

brbg <- brewer.pal(11, "BrBG")
cols <- c(colorRampPalette(c(brbg[1], brbg[6]))(51), 
    colorRampPalette(c(brbg[6], brbg[11]))(51)[-1])

enter image description here

同様に、選択したviridisパレットとmagmaパレットを使用して、それらの間の類似点を見つけることができます。これは、パレットを連続して結合するポイントとなる場合があります。

select.col <- function(cols1, cols2){
    x <- col2rgb(cols1)
    y <- col2rgb(cols2)
    sim <- which.min(colSums(abs(x[,ncol(x)] - y)))
    message(paste("Your palette will be", sim, "colors shorter."))
    cols.x <- apply(x, 2, function(temp) rgb(t(temp)/255))
    cols.y <- apply(y[,sim:ncol(y)], 2, function(temp) rgb(t(temp)/255))
    return(c(cols.x,cols.y))
}

img(select.col(rev(viridis(100,0)),magma(100,0)), "")
# Your palette will be 16 colors shorter.

Palette

7
nya