PyPlot.jl と Plots.jl と Makie.jl の色

幸か不幸か julia のグラフ用パッケージは、色々あって、どれも一長一短です。 いくつか組合せなどが必要になる場合に、色を揃えたいことがあります。 カラーパレットやカラーマップなどと呼ばれる勾配を付けた連続色を使っている場合は、ちょっと、苦労します。 できるだけ、統一した方法が良いですから、色の名前よりも RGB の値などで指定できると良いですね。

RGBなどで、指定する場合のお作法などを、少しまとめてみます。

julia で、色を使う場合は、ColorTypes.jl を呼び出すのが良いでしょう。

ここで、N0f8 という形式 "Normalized with 8 fractional bits, with 0 bits left for representing values higher than 1." を使用するために、FixedPointNumbers.jl も加えておく方が良いようです。

julia> using FixedPointNumbers, ColorTypes

julia> RGB(1,1,1)
RGB{N0f8}(1.0,1.0,1.0)

これで、RGB() が動きます。

実際に plot してみましょう。

julia> using Plots

julia> plot([1:10;], color=RGB(0.2,0.3,0.4))

julia> plot!([1:10;].+0.1, color=RGB(0.9,0.1,0.1))

julia> plot!([1:10;].+0.2, color=RGB(0.1,0.8,0.1))

こんな感じで、色指定ができます。

RGB() は、赤だけ、青だけなどが数字で取り出せます。

julia> red(RGB(0.1,0.2,0.3))
0.1

これを利用すれば、PyPlot に色を持って行けます。

julia> using PyPlot

julia> rgb_sequence(c::RGB) = (red(c), green(c), blue(c))

julia> PyPlot.plot([1:10;], color=rgb_sequence(RGB(0.2,0.3,0.4)))
1-element Array{PyObject,1}:
 PyObject 

julia> PyPlot.plot([1:10;].+0.1, color=rgb_sequence(RGB(0.9,0.1,0.1)))
1-element Array{PyObject,1}:
 PyObject 

julia> PyPlot.plot([1:10;].+0.2, color=rgb_sequence(RGB(0.1,0.8,0.1)))
1-element Array{PyObject,1}:
 PyObject 

次に、カラーパレットやカラーマップを使ってみます。

PyPolot なら、seaborn の拡張を使っています。seaborn は、julia で、PyPlot & seaborn を動かすを見て下さいね。

julia> using PyCall

julia> @pyimport seaborn as sns

julia> sns.color_palette("cubehelix", 24)
24-element Array{Tuple{Float64,Float64,Float64},1}:
 (0.05809004524160909, 0.024219876979716743, 0.06817258062534762)
 (0.0928452401082787, 0.05843437322336474, 0.14637799103819257)
 (0.10425205507031031, 0.10540252695041774, 0.21985456650857077)
 (0.09866086876085636, 0.16435904391510084, 0.2753878375324802)
 (0.08605633600581405, 0.23824692404212, 0.30561236308077167)
 (0.08278043952023958, 0.3068599910557119, 0.30303666981750255)
 (0.09944093631903905, 0.36967074725820875, 0.27721053847219584)
 (0.14383209276515602, 0.4206563125394059, 0.239181557311351)
 (0.22705684073266794, 0.45868034672725755, 0.20041465571348596)
 (0.3292772926340829, 0.4762845556584382, 0.1837155549758328)
 (0.4466800217219925, 0.4806650235774908, 0.19653790015837083)
 (0.5660668695319436, 0.4774304306540262, 0.24479365438842796)
 (0.6832386640154413, 0.47365800580526857, 0.3376259981801124)
 (0.7644583735059833, 0.4779114713477098, 0.449810726039847)
 (0.8146245329198283, 0.49548316572322215, 0.5752525936416857)
 (0.8331304242651412, 0.5295114386920498, 0.698773225633891)
 (0.8235993862938871, 0.5857333462008708, 0.8153698764107113)
 (0.7991830216908599, 0.6502183448479701, 0.8925917207600751)
 (0.7733053855666262, 0.7213747103988148, 0.9380158664236004)
 (0.7587183008012618, 0.7922069335474338, 0.9543861221913403)
 (0.7670014399195808, 0.8619968352801741, 0.9496243353469522)
 (0.8009580475986687, 0.9131944212213802, 0.9389160700563687)
 (0.8574820775589871, 0.9513109722713152, 0.9368224724702245)
 (0.9280257843073016, 0.9785040757363161, 0.9550830472713414)

次に Makie なら、

julia> using Makie

julia> Makie.to_colormap(:viridis, 24)
24-element Array{RGBA{Float32},1} with eltype RGBA{Float32}:
 RGBA{Float32}(0.26666668f0,0.003921569f0,0.32941177f0,1.0f0)
 RGBA{Float32}(0.2796249f0,0.068712704f0,0.39096338f0,1.0f0)
 RGBA{Float32}(0.28235295f0,0.1258312f0,0.4448423f0,1.0f0)
 RGBA{Float32}(0.27672637f0,0.18090367f0,0.48542202f0,1.0f0)
 RGBA{Float32}(0.26462063f0,0.23478262f0,0.51423705f0,1.0f0)
 RGBA{Float32}(0.24739985f0,0.28610402f0,0.5353794f0,1.0f0)
 RGBA{Float32}(0.22472295f0,0.33469737f0,0.54833764f0,1.0f0)
 RGBA{Float32}(0.20511511f0,0.37715262f0,0.5520887f0,1.0f0)
 RGBA{Float32}(0.18567775f0,0.41926688f0,0.55532825f0,1.0f0)
 RGBA{Float32}(0.16794544f0,0.4613811f0,0.5568628f0,1.0f0)
 RGBA{Float32}(0.15174766f0,0.50349534f0,0.5558398f0,1.0f0)
 RGBA{Float32}(0.13589089f0,0.5452686f0,0.5522592f0,1.0f0)
 RGBA{Float32}(0.12293266f0,0.5841432f0,0.54578006f0,1.0f0)
 RGBA{Float32}(0.12446719f0,0.6259165f0,0.5335039f0,1.0f0)
 RGBA{Float32}(0.14543906f0,0.66581416f0,0.5116795f0,1.0f0)
 RGBA{Float32}(0.18994033f0,0.70468885f0,0.48269397f0,1.0f0)
 RGBA{Float32}(0.256607f0,0.742711f0,0.44688836f0,1.0f0)
 RGBA{Float32}(0.33844844f0,0.7781757f0,0.40085256f0,1.0f0)
 RGBA{Float32}(0.43563515f0,0.81057125f0,0.3425405f0,1.0f0)
 RGBA{Float32}(0.543734f0,0.8375107f0,0.27604434f0,1.0f0)
 RGBA{Float32}(0.655925f0,0.8593351f0,0.20392157f0,1.0f0)
 RGBA{Float32}(0.7706735f0,0.87740844f0,0.13895994f0,1.0f0)
 RGBA{Float32}(0.8852516f0,0.8929242f0,0.10622337f0,1.0f0)
 RGBA{Float32}(0.9921569f0,0.9058824f0,0.14509805f0,1.0f0)

Plots の cgrad では、30の規定階層から選んでいるようです。

julia> using Plots

julia> plot()

julia> for i in 1:30; plot!([1:2;].+0.01i, color= cgrad(:viridis)[i]);end

julia> plot!()

おしまい。

B! LINE