ujimushi(@旧sradjp(15364))の日記

旧スラドの日記の引越先です

背景を透明・半透明にするTips & background_color他 (Plots.jl(GR))

元々plt=plot(sin); plt.attr[:backdround_color]RGBA{Float64}(1.0, 1.0, 1.0, 1.0)だった ところから確認したら分かったことを元に書きますが,基本はアトリビュートの紹介です。

今回紹介するAttribute一覧

次の通りですが,legend_background_colorは一度紹介しており,再登場です。

  • background_color (Plot Attributes)
  • background_color_outside (Plot Attributes)
  • background_color_inside (Subplot Attributes)
  • background_color_subplot (Subplot Attributes)
  • legend_background_color (Subplot Attributes)

別名

多いです。としか…

background_color

  • background
  • background_colors
  • background_colour
  • backgroundcolors
  • backgroundcolour
  • bg
  • bg_color
  • bg_colour
  • bgcolor
  • bgcolour

background_color_outside

  • background_color_outsides
  • background_colour_outside
  • background_outside
  • backgroundcoloroutsides
  • backgroundcolouroutside
  • backgroundoutside
  • bg_color_outside
  • bg_colour_outside
  • bg_outside
  • bgcolor_outside
  • bgcoloroutside
  • bgcolour_outside
  • bgcolouroutside
  • bgoutside

background_color_inside

  • background_color_insides
  • background_colour_inside
  • background_inside
  • backgroundcolorinsides
  • backgroundcolourinside
  • backgroundinside
  • bg_color_inside
  • bg_colour_inside
  • bg_inside
  • bgcolor_inside
  • bgcolorinside
  • bgcolour_inside
  • bgcolourinside
  • bginside

background_color_subplots

  • background_color_subplots
  • background_colour_subplot
  • background_subplot
  • backgroundcolorsubplots
  • backgroundcoloursubplot
  • backgroundsubplot
  • bg_color_subplot
  • bg_colour_subplot
  • bg_subplot
  • bgcolor_subplot
  • bgcolorsubplot
  • bgcolour_subplot
  • bgcoloursubplot
  • bgsubplot

legend_color_subplots

legend_((foreground|background)_color|column)(Plots.jl(GR))を参照。

使用例

別名が多いので,本当に別名が使えるのかの確認をやっていきます。

bakcground_color

Plot Attributeなので,別名毎に一つずつ描いて合成しています。

using Plots
using TikzPictures
import GR
gr()

my_node(names, n) = (n in eachindex(names) ?
    "\\node {\\includegraphics[width=81.28mm]{$(names[n]).png}};" : "")

bgcnames = [:background_color, :background, :background_colors,
             :background_colour, :backgroundcolors, :backgroundcolour,
             :bg, :bg_color, :bg_colour, :bgcolor, :bgcolour]

for n in bgcnames
    plot(sin; title="$n=:cyan", size=(320, 200), (;n => :cyan,)...)
    savefig("$n.png")
end

io = IOBuffer()

println(io, "\\node[matrix] {")
for k in 0:3
    print(io, "$(my_node(bgcnames, k*3+1)) & ")
    print(io, "$(my_node(bgcnames, k*3+2)) & ")
    println(io, "$(my_node(bgcnames, k*3+3)) \\\\")
end
println(io, "};")

tp_bgc = TikzPicture(
String(take!(io)), preamble="""
  \\usepackage{luatexja}
  \\usepackage{graphicx}
""")
save(SVG("background_color_all"), tp_bgc)
run(`inkscape -w 1024 -o background_color_all.png background_color_all.svg`)

別名は全てうまく動いているようです。それぞれプロット全体の背景の色が変更されます。

bakcground_color_outside

名前から外側の背景の設定と想像されます。下の例から想像通りの挙動となっているようです。

using Plots
using TikzPictures
import GR
gr()

my_node(names, n) = (n in eachindex(names) ?
    "\\node {\\includegraphics[width=81.28mm]{$(names[n]).png}};" : "")

bgconames = [
    :background_color_outside, :background_color_outsides,
    :background_colour_outside, :background_outside,
    :backgroundcoloroutsides, :backgroundcolouroutside,
    :backgroundoutside, :bg_color_outside, :bg_colour_outside,
    :bg_outside, :bgcolor_outside,:bgcoloroutside,
    :bgcolour_outside, :bgcolouroutside, :bgoutside
]

for n in bgconames
    plot(sin; title="$n=:cyan", size=(320, 200), titlefontsize=12,
         (;n => :cyan,)...)
    savefig("$n.png")
end

println(io, "\\node[matrix] {")
for k in 0:4
    print(io, "$(my_node(bgconames, k*3+1)) & ")
    print(io, "$(my_node(bgconames, k*3+2)) & ")
    println(io, "$(my_node(bgconames, k*3+3)) \\\\")
end
println(io, "};")

tp_bgco = TikzPicture(
String(take!(io)), preamble="""
  \\usepackage{luatexja}
  \\usepackage{graphicx}
""")
save(SVG("background_color_outside_all"), tp_bgco)
run(`inkscape -w 1024 -o background_color_outside_all.png background_color_outside_all.svg`)

bakcground_color_inside

Subplot Attributeなので,一つのグラフでまとめて描画します。

using Plots
using TikzPictures
import GR
gr()

bgcinames = [
    :background_color_inside, :background_color_insides,
    :background_colour_inside, :background_inside,
    :backgroundcolorinsides, :backgroundcolourinside,
    :backgroundinside, :bg_color_inside, :bg_colour_inside,
    :bg_inside, :bgcolor_inside, :bgcolorinside,
    :bgcolour_inside, :bgcolourinside, :bginside
]

plt_bgci = plot(
    [plot(sin; title="$n=:cyan", (;n => :cyan, :titlefontsize => 12)...)
     for n in bgcinames]...,
    size=(1024, 1280), layout=(5, 3))
savefig(plt_bgci, "background_color_inside_all.png")

グラフ描画領域の内側の背景の設定のようです。

bakcground_color_subplot

using Plots
using TikzPictures
import GR
gr()

bgcsnames = [
    :background_color_subplots, :background_color_subplots,
    :background_colour_subplot, :background_subplot,
    :backgroundcolorsubplots, :backgroundcoloursubplot,
    :backgroundsubplot, :bg_color_subplot,
    :bg_colour_subplot, :bg_subplot, :bgcolor_subplot,
    :bgcolorsubplot, :bgcolour_subplot,
    :bgcoloursubplot, :bgsubplot
]

plt_bgcs = plot(
    [plot(sin; title="$n=:cyan", (;n => :cyan, :titlefontsize => 12)...)
     for n in bgcsnames]...,
    size=(1024, 1280), layout=(5, 3))
savefig(plt_bgcs, "background_color_subplot_all.png")

設定してみると,background_color_insideとの違いが分かりません。 どちらかを設定するといいのでしょうか?

透明・半透明

背景色はアルファチャンネルのAttributeがないので, 透明・半透明を指定するにはアルファチャンネルを含んだ色を設定する必要があります。

using Plots
import GR
gr()

plt_透明 = plot(
    sin; plot_title="背景透明",
    title="background_color=RGBA(1.0, 1.0, 1.0, 0.0)",
    background_color=RGBA(1.0, 1.0, 1.0, 0.0),
    plot_titlefontfamily="ipag")
savefig(plt_透明, "背景透明.png")

Plots.jlの背景を透明にする(Zenn)では黒が透明になるとの情報があるのですが, 今はうまく動いているように見えます。

using Plots
import GR
gr()

plt_trans = plot(
    sin; plot_title="背景透明2",
    title="background_color=:transparent",
    background_color=:transparent,
    plot_titlefontfamily="ipag")
savefig(plt_trans, "transparent.png")

次は半透明の例です。colorant"色名"や,RGBA(RGB(...), α)とかを利用すると設定しやすいと思います。

using Plots
import GR
gr()

plt_半透明 = plot(
    sin; plot_title="背景半透明",
    title="background_color=RGBA(colorant\"white\", 0.5)",
    background_color=RGBA(colorant"white", 0.5),
    plot_titlefontfamily="ipag")
savefig(plt_半透明, "背景半透明.png")

どうも全体の背景を白の半透明にすると,Plots.jl側で勝手に色を変えているようです。 不思議。

凡例の背景のように個別に設定するとはっきりそこだけ変更されますね。

using Plots
import GR
gr()

plt_凡例半透明 = plot(
    sin; plot_title="凡例半透明",
    title="legend_background_color=RGBA(colorant\"yellow\", 0.5)",
    legend_background_color=RGBA(colorant"yellow", 0.5),
    plot_titlefontfamily="ipag",
    legend_position=(0.52, 0.5),
    titlefontsize=12)
savefig(plt_凡例半透明, "凡例半透明.png")

凡例の場合は背景透明を利用すると,外枠も消して見かけを変えることができます。

using Plots
import GR
gr()

plt_凡例透明 = plot(
    sin; plot_title="凡例透明",
    title="legend_background_color=RGBA(1.0, 1.0, 1.0, 0.0)\nlegend_foreground_color=nothing",
    legend_background_color=RGBA(1.0, 1.0, 1.0, 0.0),
    legend_foreground_color=nothing,
    legend_position=(0.52, 0.5),
    plot_titlefontfamily="ipag")
savefig(plt_凡例透明, "凡例透明.png")

おまけ

pngファイルの純粋な白を透明にするとかは次のようにしたらできるかもしれません。 ただし,全ての色が不透明であることを前提に動いているので,うまくいかないケースも多々あると思います。

using Colors
using FileIO

img = FileIO.load("凡例透明.png")
img_alpha = RGBA.(img, 1.0)
img_alpha[img_alpha .== RGBA{Colors.N0f8}(1.0,1.0,1.0,1.0)] .= RGBA(colorant"white", 0.0)

FileIO.save("透明化例.png", img_alpha)