20160516

Broken axisのサンプルコードを読み解く

figure_16.png

上手な人には、「何でそんな事をワザワザ」と思うかもしれないが、Matplotlibの使い方を知らない人には、分からないのでメモしておく。
自分が、こんな感じで解説が欲しかったし。

Matplotlibの公式サイトで、broken axisとして紹介されているグラフの描き方が、日本語ではないのでよく分からないし。

Matplotlibのギャラリーには、broken axis のグラフを描くためにこういう風にかいてあるけど、
いろいろなコマンドを組み合わせて使っているから、何をすれば、にょろにょろになるのか、検討が付かない。

自分は、ワンタッチで画像が欲しい。
Broken_axisコマンドとかあったら、たとえ引数が多くても、それを使いたい。
でも、そんなものはない。
要素ごとに確認していく。
import matplotlib.pyplot as plt
f, (ax, ax2) = plt.subplots(2, 1)
f.show()

figure_0.png
subplotが基本構造ですよ。

subplotは前回描いたが、
グラフを分割して描いてくれる。
ax1 = plt.subplots(2, 1, 1)
ax2 = plt.subplots(2, 1, 2, sharex=True)のようにバラバラでもいいが、まとめて書くには、
f, (ax1, ax2) = plt.subplots(2,1)とか。

上記の画像の様に、1画像に2グラフ(以上)縦に並べて描く時は、x軸が同期している事が多い(もしくは、横に並べる場合はy軸が同期していることが多い)。
だから、sharexがsubplotの中に用意されていて、
f, (ax1, ax2) = plt.subplots(2,1, sharex = True)
とすると、片方のグラフにxが100とか、-100とかが入って、自動的にグラフの大きさが調節された時に、ax1, ax2が同時に動いてくれる。
Trueの反対はFalse。Boolean型の変数。bool型。

import matplotlib.pyplot as plt

f, (ax, ax2) = plt.subplots(2, 1, sharex=True)
f.show()

Broken_axis_1.png
sharexすると、subplot間で、x軸が共有されます。
xがshareでsharexって事なんでしょう。
shareyもあるし。

sharexが機能しているところ
"""
sharex01
"""

import matplotlib.pyplot as plt
import numpy as np

f, (ax1, ax2) = plt.subplots(2, 1, sharex=True)

theta1 = np.linspace(0,np.pi,1001)

y1 = np.sin(theta1)

ax1.plot(theta1, y1)

ax1.set_ylim(-1, 1)
ax2.set_ylim(-1, 1)


#plt.xticks(x, label, fontsize = 7)

plt.show()



"""
sharex02
"""

import matplotlib.pyplot as plt
import numpy as np

f, (ax1, ax2) = plt.subplots(2, 1, sharex=True)

theta1 = np.linspace(0,np.pi,1001)
theta2 = np.linspace(0,np.pi,1001)*2

y1 = np.sin(theta1)
y2 = np.sin(theta2)

ax1.plot(theta1, y1)
ax2.plot(theta2, y2)

ax1.set_ylim(-1, 1)
ax2.set_ylim(-1, 1)

#plt.xticks(x, label, fontsize = 7)

plt.show()

sharex01
sharex_19.png
sharex02
sharex_20.png
別のグラフ扱いであるはずのax1も、ax2にプロットされたデータと同じxになるように伸縮する。
まあ、Broken axisの時には、ax1もax2も同じデータを載せるので、横に伸び縮みもしないはずなので、あまり意識しない部分ではありますが、重要なので一応。


import matplotlib.pyplot as plt

f, (ax, ax2) = plt.subplots(2, 1, sharex=True)
ax.spines['bottom'].set_visible(False)
ax2.spines['top'].set_visible(False)
f.show()
figure_2.png

spines[位置].set_visible(False)
で位置の所には、left, right, bottom, topのどれかを、文字列として入れる。
文字列としていれるってことは、
["top"]とか['left']って囲まなきゃいけないんだよ。pythonでは。
英語で言うとstringだし、str型の変数ともいう。

Falseがなんで文字列みたいな扱いじゃなくてもいいのかというと、文字列じゃないから。
文字列なら""と囲っとかないとだめだし、False何て変数は定義していない。
組み込み関数でもない。
変数bool型は、TrueかFalseをもつ型。
intは1とか-10とか。(整数:integer)
uintは、マイナスをとらない1とか10(unsigned int)最近、画像処理してて知った。
要るよこれ。RGBの値がマイナス行ったら変だよ。
floatは0.1とか。(浮動小数点)


話を元に戻すと、
上の画像には、何か変なのが残ってしまいました。
tickってやつが残っている。
f, (ax, ax2) = plt.subplots(2, 1, sharex=True)
ax.spines['bottom'].set_visible(False)
ax2.spines['top'].set_visible(False)
ax.xaxis.tick_top()
ax2.xaxis.tick_bottom()
f.show()

figure_3.png
上下にぶち抜いてやったぜ。

ただ、正直な所、ぶち抜く必要は無いかも。
import matplotlib.pyplot as plt

f, (ax, ax2) = plt.subplots(2, 1, sharex=True)

ax.xaxis.tick_top()
ax2.xaxis.tick_bottom()

f.show()

figure_13.png
これも、その一個前のグラフも、ラベルが付いてしまっている。

ax.tick_params(labeltop='off')
で確実に落とす。

Broken_axis_5.png

ここも参考になる。
http://stackoverflow.com/questions/12998430/remove-xticks-in-a-matplot-lib-plot
こんな感じに3段だって可能。
f, (ax, ax2, ax3) = plt.subplots(3, 1, sharex=True)
ax.spines['bottom'].set_visible(False)
ax2.spines['top'].set_visible(False)
ax2.spines['bottom'].set_visible(False)
ax3.spines['top'].set_visible(False)

ax.xaxis.tick_top()
ax2.tick_params(axis='x', which='both', bottom='off', top='off', labelbottom='off')
ax3.xaxis.tick_bottom()
ax.tick_params(labeltop='off')
plt.show()


015.png

016.png



いよいよデータを載せていく
データには、sinカーブの前半分を、数乗して使う。
数乗って言い回しはないのだろうか。
書いちゃうけど。

1乗だと、sinカーブの前半分。
Broken_axis_6.png
数乗すると、既に大きい所はより大きく、小さい所はより小さく変化していく。

subplotを出した時点で分かるとは思うけど、下のグラフと上のグラフのプロットは、同じものではない。
下のデータの値が大きすぎると、上の方まではみ出てくるとか、そういう仕組みではない。
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0,1,1001)

theta = np.linspace(0,np.pi,1001)

#y = np.sin(theta)
#y = np.sin(theta)**10
#y = np.sin(theta)**1000
y = np.sin(theta)**77
#y = np.sin(theta)**5

f, (ax, ax2) = plt.subplots(2, 1, sharex=True)
ax.spines['bottom'].set_visible(False)
ax2.spines['top'].set_visible(False)
ax.xaxis.tick_top()
ax2.xaxis.tick_bottom()
ax.tick_params(labeltop='off')

ax.plot(x,y,"r")
ax2.plot(x,y,"b")

f.show()


はっきりと区別された2つのグラフに、それぞれ二つ独立させて載せて。。。
Broken_axis_8.png



ylimを調節して、うまい具合に見えるようにする。
round(max(y))とかで、最大値を丸め込めばいいのではないかと。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0,1,1001)

theta = np.linspace(0,np.pi,1001)

#y = np.sin(theta)
#y = np.sin(theta)**10
y = np.sin(theta)**1000
#y = np.sin(theta)**100
#y = np.sin(theta)**5

f, (ax, ax2) = plt.subplots(2, 1, sharex=True)
ax.spines['bottom'].set_visible(False)
ax2.spines['top'].set_visible(False)
ax.xaxis.tick_top()
ax2.xaxis.tick_bottom()
ax.tick_params(labeltop='off')

ax.plot(x,y,"r")
ax2.plot(x,y,"b")

ax.set_ylim(.7, 1.)
ax2.set_ylim(0, .3)

f.show()

figure_12.png

ずばずば。コードは、http://matplotlib.org/examples/pylab_examples/broken_axis.htmlがそのまんま使用できるので、そのまま使用した。だから載せない。
上記コードのplt.show()の前にでも書けばこうなる。
figure_15.png

ダメ押し
http://qiita.com/ynakayama/items/8d3b1f7356da5bcbe9bcを参考に、

plt.subplots_adjust(wspace=0, hspace=0.05)
の一行でもってsubplotを縦に詰めてみた。

figure_16.png

にょろにょろは。。。
"にょろ"とタイプすると〜が出てくる。〜は「にょろ」だ!見破ったぞ!!ま、こんなの朝飯前さ。自分にかかればこんなことお見通しなんだぜ!!にょろにょろ。すげ

よくみたら、この環境ではsin(θ) [0<θ<2π]になってる。

この記事は、3日前の記事よりも前に書き始めて、中途半端な所で手が止まっていたので、前後してしまった。
内容が重複しているけど、少しでも多くの例を見れたら、面白いかなと思い、やった。
posted by yuchan at 07:00 | Comment(0) | python
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: