
上手な人には、「何でそんな事をワザワザ」と思うかもしれないが、Matplotlibの使い方を知らない人には、分からないのでメモしておく。
自分が、こんな感じで解説が欲しかったし。
Matplotlibの公式サイトで、broken axisとして紹介されているグラフの描き方が、日本語ではないのでよく分からないし。
Matplotlibのギャラリーには、broken axis のグラフを描くためにこういう風にかいてあるけど、
いろいろなコマンドを組み合わせて使っているから、何をすれば、にょろにょろになるのか、検討が付かない。
自分は、ワンタッチで画像が欲しい。
Broken_axisコマンドとかあったら、たとえ引数が多くても、それを使いたい。
でも、そんなものはない。
要素ごとに確認していく。
import matplotlib.pyplot as plt
f, (ax, ax2) = plt.subplots(2, 1)
f.show()

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()

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

sharex02

別のグラフ扱いであるはずの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()

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()

上下にぶち抜いてやったぜ。
ただ、正直な所、ぶち抜く必要は無いかも。
import matplotlib.pyplot as plt
f, (ax, ax2) = plt.subplots(2, 1, sharex=True)
ax.xaxis.tick_top()
ax2.xaxis.tick_bottom()
f.show()

これも、その一個前のグラフも、ラベルが付いてしまっている。
ax.tick_params(labeltop='off')
で確実に落とす。

ここも参考になる。
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()


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

数乗すると、既に大きい所はより大きく、小さい所はより小さく変化していく。
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つのグラフに、それぞれ二つ独立させて載せて。。。

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()

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

ダメ押し
http://qiita.com/ynakayama/items/8d3b1f7356da5bcbe9bcを参考に、
plt.subplots_adjust(wspace=0, hspace=0.05)
の一行でもってsubplotを縦に詰めてみた。

にょろにょろは。。。
"にょろ"とタイプすると〜が出てくる。〜は「にょろ」だ!見破ったぞ!!ま、こんなの朝飯前さ。自分にかかればこんなことお見通しなんだぜ!!にょろにょろ。すげ
よくみたら、この環境ではsin(θ) [0<θ<2π]になってる。
この記事は、3日前の記事よりも前に書き始めて、中途半端な所で手が止まっていたので、前後してしまった。
内容が重複しているけど、少しでも多くの例を見れたら、面白いかなと思い、やった。
【pythonの最新記事】
- 中速フーリエ変換 ~離散フーリエ変換より..
- 断面二次モーメントを、座標点の配列から計..
- 断面二次モーメントを、座標点の配列から計..
- fontファイルの文字データ(グリフ)を..
- matplotlibのpyplot.pl..
- 計算力学技術者試験の問題集 自炊(裁断→..
- pythonで、ホワイトノイズやピンクノ..
- 脳ドッグに行ってきた。→MRIの画像デー..
- matplotlibのimshowで円を..
- matplotlibの、cmapを、徐々..
- matplotlibのmake_axes..
- matplotlib floatinga..
- matplotlib plotの色を、値..
- Pythonで、「二次元フーリエ変換した..
- matplotlibのlinestyle..
- どちらが正しいRGBか。(matplot..
- matplotlibのannotateの..
- matplotlibで、x軸とy軸の数字..
- VBAで、pythonのrangeとか、..
- matplotlibのaxes3Dで、a..