Hatena::ブログ(Diary)

sobasobasobaの備忘録

2012-12-31

ipython + matplotlib で試しに何かプロットしてみる

| 14:16

  • コンソールで以下を入力し、ipythonを起動。
$ ipython -pylab
  • ipythonで以下を入力
In [1]: plot([1,2,3,4])
In [2]: plot([0,3,2,7])
In [3]: draw()
  • すると、以下のようなウィンドが表示される。

f:id:sobasobasoba:20121231141622p:image:medium

ipython 使用に際して起こった問題のメモ

| 14:14

  • コンソールより、以下を入力して ipython を起動。
 $ ipython -pylab
  • すると、以下のようなエラーが出る。
TclError: no display name and no $DISPLAY environment variable
  • どうやら、環境変数 $DISPLAY に値がセットされていないのが問題そうなので、以下をコンソールで入力。
$ export DISPLAY=localhost:0.0
  • 再び ipython を起動しようとすると、以下のエラーが出る。
TclError: couldn't connect to display "localhost:0.0"
  • どうやら、X Window Server が必要で、X-Tunnelling ができる状態になっている必要があるらしい(?)
  • そのため、コンソールで以下を入力(この方法が正攻法か不明)。結果、うまく起動できるようになった。
$ startxwin &

ipython のインストール

| 14:06

ipython & matplotlib の組み合わせで、対話的にグラフのプロットを行うことができる。

 backend: TkAgg
 interactive: True

SciPy のインストール

| 13:48

matplotlib のインストール方法

| 13:45

1. NumPy のインストール

$ python setup.py build
$ python setup.py install

2. matplotlibのインストール

$ python setup.py build
$ python setup.py install

(matplotlib を使うためには、 NumPy とセットでインストールすること)

テキスト表示の際、図中の座標値を指定

| 13:38

f:id:sobasobasoba:20121231133834p:image:medium

関数 ax.text(x,y,txt) とすると、描画するデータを基にした(x,y)座標にテキストを表示する。

関数 ax.text(x,y,txt,transform=ax.transAxes) とすると、図の上での(x,y)座標にテキストを表示する。

#!/usr/bin/env python


import matplotlib.pyplot as plt


def plot():
    fig = plt.figure()
    ax = fig.add_subplot(1,1,1)    

    ax.plot([1,2,3,0.5])

    ax.text(0.3,0.1,"ABC",transform=ax.transAxes)
    ax.text(0.4,0.3,"DEF",transform=ax.transAxes)
    ax.text(0.6,0.6,"GHI",transform=ax.transAxes)
    ax.text(0.7,0.8,"JKL",transform=ax.transAxes)
    
    plt.savefig('test.png')


if __name__=="__main__":
    plot()

※参照: http://matplotlib.org/users/transforms_tutorial.html#axes-coordinates

グラフのラベルが重ならないよう自動調整

| 13:32

調整した場合: f:id:sobasobasoba:20121231133405p:image:medium

調整しない場合: f:id:sobasobasoba:20121231133319p:image:medium

fig.tight_layout() とすることで、グラフ同士のラベルが重ならない程度にグラフを小さくする。

#!/usr/bin/env python


import matplotlib.pyplot as plt


def plot():
    fig = plt.figure()

    for r in range(3):
        for c in range(4):
            ax = fig.add_subplot(3,4,r*4+c)

            ax.set_title("Title")
            ax.set_ylabel("Y Label")
            ax.set_xlabel("X Label")
    fig.tight_layout()
    
    plt.savefig('test.png')


if __name__=="__main__":
    plot()

※参照: http://matplotlib.org/users/tight_layout_guide.html

プロット図を縮小して空きを作る(応用)

| 13:19

f:id:sobasobasoba:20121231131903p:image:medium

図の右側に空きを作り、そこに箱髭図の各値(中央値、箱の上端、箱の下端、髭の上端、髭の下端、外れ値)を表示する。

#!/usr/bin/env python


import random
import dateutil.parser as parser
import matplotlib.pyplot as plt
import matplotlib.dates as mdates


def plot():
    val = []
    val.append([random.normalvariate(0,100) for j in range(10000)])
    val.append([random.normalvariate(20,50) for j in range(10000)])    
    
    fig = plt.figure()
    ax = fig.add_subplot(1,1,1)    

    ax.set_ylim([-400,400])
    ax.grid()
    ax.set_xticklabels(["A","B"])

    bp = ax.boxplot(val)

    txt = "A info:\n"
    txt += "Median = %.2f\n"%bp["medians"][0].get_ydata()[0]
    txt += "3rd Quartile = %.2f\n"%bp["boxes"][0].get_ydata()[2]
    txt += "1st Quartile = %.2f\n"%bp["boxes"][0].get_ydata()[0]
    txt += "Upper Whisker = %.2f\n"%bp["whiskers"][1].get_ydata()[1]
    txt += "Lower Whisker = %.2f\n"%bp["whiskers"][0].get_ydata()[1]
    txt += "Highest Flier = %.2f\n"%sorted(bp["fliers"][0].get_ydata())[-1]
    txt += "Lowest Flier = %.2f\n"%sorted(bp["fliers"][1].get_ydata())[0]
    txt += "\n"

    txt += "B info:\n"
    txt += "Median = %.2f\n"%bp["medians"][1].get_ydata()[0]
    txt += "3rd Quartile = %.2f\n"%bp["boxes"][1].get_ydata()[2]
    txt += "1st Quartile = %.2f\n"%bp["boxes"][1].get_ydata()[0]
    txt += "Upper Whisker = %.2f\n"%bp["whiskers"][3].get_ydata()[1]
    txt += "Lower Whisker = %.2f\n"%bp["whiskers"][2].get_ydata()[1]
    txt += "Highest Flier = %.2f\n"%sorted(bp["fliers"][2].get_ydata())[-1]
    txt += "Lowest Flier = %.2f\n"%sorted(bp["fliers"][3].get_ydata())[0]

    ax.text(1.2, 0.1 , txt, fontsize=12, transform=ax.transAxes)
    fig.subplots_adjust(right=0.5)

    plt.savefig('test.png')


if __name__=="__main__":
    plot()

プロット図を縮小して空きを作る

| 13:13

縮小した図: f:id:sobasobasoba:20121231131423p:image:medium

縮小しない図: f:id:sobasobasoba:20121231131431p:image:medium

fig.subplots_adjust(top=0.7) とし、図の上側に空きを作る。

#!/usr/bin/env python


import random
import matplotlib.pyplot as plt


def plot():
    xval = [random.normalvariate( 50,100) for i in range(10000)]
    yval = [random.normalvariate(-50,100) for i in range(10000)]
    
    fig = plt.figure()
    ax = fig.add_subplot(1,1,1)    

    ax.set_xlim([-400,400])
    ax.set_ylim([-400,400])
    ax.grid()

    ax.plot(xval,yval,linestyle="None",marker="+")

    fig.subplots_adjust(top=0.7)

    plt.savefig('test.png')


if __name__=="__main__":
    plot()


subplots_adjust()の仕様:

subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)

  • 各値の意味(とデフォルト値):
    • left = 0.125: 図の左端
    • bottom = 0.1: 図の下端
    • right = 0.9: 図の右端
    • top = 0.9: 図の上端
    • wspace = 0.2: subplot間の横幅の空き
    • hspace = 0.2: subplot間の縦幅の空き

デフォルト値は rc ファイルで設定可能。



参照: http://matplotlib.org/api/pyplot_api.html?highlight=subplots_adjust#matplotlib.pyplot.subplots_adjust

shinya_ohtanishinya_ohtani 2015/11/19 20:33 bottomとtopの値が逆のような...

sobasobasobasobasobasoba 2015/12/02 22:36 ご指摘ありがとうございます。修正しました