20180305

matplotlibのmake_axes_locatableで作ったcolorbarの透明度を変更する

color bar の軸の色を調節する。

matplotlibのcolorbarをいじっている。

03.gif

colorbarの高さを、軸の高さに合わせるために、make_axes_locatableを使った。
make_axes_locatableを使った後、標準のcolorbarとは、使い勝手が変わっているように感じる。
とりあえず、make_axes_locatableを使った後の、cbarの軸を透明化する方法を、書き残しておく。


# coding: utf-8
import math
import time
from datetime import datetime as dt
import numpy as np
from PIL import Image
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
from matplotlib import ticker

N=16
img1 = [[math.sin(2 * np.pi * i * j /float(N)) for i in range(N)] for j in range(N)]


fig = plt.figure()
loc_ax = [0.1,0.2,0.8,0.7]
ax1 = fig.add_axes(loc_ax)
imgcol1 = ax1.imshow(img1, vmax=1, vmin=-1, cmap = 'gray', interpolation='nearest')
ax1.set_ylabel("frq m [Hz]")
ax1.set_xlabel("horizontal px h [px]")

divider1 = make_axes_locatable(ax1)
ax_cb0 = divider1.new_horizontal(size="10%", pad=0.05)
ax_cb01 = fig.add_axes(ax_cb0)
cb1 = plt.colorbar(imgcol1, cax=ax_cb0)
tick_locator1 = ticker.MaxNLocator(nbins=5)
cb1.locator = tick_locator1
cb1.update_ticks()
ax1.locator_params(axis='x', nbins=4)
ax1.locator_params(axis='y', nbins=7)
cb1.set_label("real part")
ax1.set_axis_on()

#############
#insert here#
#############

tdatetime = dt.now()
itext = tdatetime.strftime('%Y%m%d'+ time.ctime()[11:13] + time.ctime()[14:16] + time.ctime()[17:19])
fig.canvas.draw()
# save it to a numpy array.
data = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep='')
data = data.reshape(fig.canvas.get_width_height()[::-1] + (3,))
im = Image.fromarray(data)
im.save("%s.png"%(itext))
plt.close()
im.close()

20180304144407.png

これから書くコードの断片は、上記コードの、

#############
#insert here#
#############

って所に、挿入するという形で進める。

禁止

  • 色付き画像を重ねる方法は禁止。
画像の上に、色調節したポリゴンか何かを重ねて、透明っぽくするのは禁止。
たとえば、imshowを使って、背景色と同じ色を重ねて、透明っぽくするとかは禁止。
あくまでも、各パーツを透明にする。
#############
#insert here#
#############
img2 = [[[191,191,191,50] for i in range(5)] for j in range(5)]
loc_ax2 = [
0.05,0.1,0.9,0.8]
ax2 = fig.add_axes(loc_ax2)
ax2.patch.set_facecolor([
0,0,0,0])#何も書いてない場合、背景は透明(ディフォルトでは白)。
imgcol2 = ax2.imshow(img2, vmax=1, vmin=-1, cmap = 'gray', interpolation='nearest')
こうやって、透明っぽくす誤魔化すのは無し。
(軸はあえて隠さなかった。)
20180304144936.png
アニメーション時の汎用性が下がる。
  • set_visibleで消すのも禁止。
「徐々に出現する」とか、「徐々に色が変わる」とかのアニメーションがしたい。
だから、True, Falseで一発で点いたり消えたりしてしまうのは無し。

各パーツ ax, spines, ticks(major, minor)

自分の語彙が無いせいだが、「軸」といったら、黒いところ全体を指して言っている。
matplotlibのドキュメントを見ると、ax, spines, ticks(major, minor)とか書き分けてある。
これ全部を透明にしたりして、出現するアニメーションをしたい。

20180304144407.png

colorbarのaxのspinesの色を変える。

20180304150030.png

色の指定は[R,G,B,A]。

color1=[0,0,0,0.0]
cb1.outline.set_edgecolor(color1)

20180304145512.png

透明にしたが、color1の部分を

color1=[1,0,0,0.8]

とかにすれば、当然着色もできる。

ticks 目盛りの部分。

20180304150707.png

ticksの部分は、

color1=[0,0,0,0.0]
cb1.ax.tick_params(axis='both', colors=color1)

label ラベルも消す。

20180304150959.png

カラーバーの場合、普通のaxと違って、余計に、axと入れないとダメ。

color1=[0,0,0,0.0]
cb1.ax.yaxis.label.set_color(color1)

二段階必要な、カラーバーの着色部分

20180304151635.png

色の部分を消したいだけなら下記でできるが、白いのが残る。カラーバーを書いてあるaxも、背景は白らしい。
alphaは、0.0〜1.0までの数値で選択。
色の指定の仕方[R,G,B,A]とは違うので注意。

cb1.solids.set_alpha(0)

20180304152157.png

背景の白いのは、下記コードで透明にできます。

cb1.patch.set_alpha(0)#layer under cbar.

カラーバーじゃない方の、axを透明化。

これらは調べればすぐにわかるけど…

spinesを消す。

20180304155248.png
color1=[0,0,0,0.0]
ax1.spines['bottom'].set_color(color1)
ax1.spines['top'].set_color(color1)
ax1.spines['left'].set_color(color1)
ax1.spines['right'].set_color(color1)

軸を消す。ticklabels(数字)も消える。

20180304155500.png
color1=[0,0,0,0.0]
ax1.tick_params(axis='both', colors=color1)

labelも消す。

20180304155619.png

x側は、

color1=[0,0,0,0.0]
ax1.xaxis.label.set_color(color1)

20180304155753.png

y側は、

color1=[0,0,0,0.0]
ax1.yaxis.label.set_color(color1)

imshowで描いたimageを消す

20180304155930.png
imgcol1.set_alpha(0.0)

20180304160002.png
ax1.patch.set_alpha(0.0)
posted by yuchan at 07:00 | Comment(0) | python
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: