第2回 - matplotlib を使ってグラフを描画する

  1. 前回までのあらすじ
  2. matplotlib の基本
  3. matplotlib の応用
  4. 本日のまとめ・小課題
今日の講義は 2回分をひとつにまとめたものなので、分量が多いです。

雑談: プログラミングをやりたい人に

「プログラミングをやりたい」 = 「運動をやりたい」
実際にやりたいのは?

プログラミングの学習に必要な機材

  1. まともなパソコン + ネット接続。
  2. 適当なプログラミング言語。 (個人的には Python がおすすめ)
  3. 何がしかの英語力。
  4. ひたすらやる気と時間。

情報リテラシの授業では、プログラミングはやりません。 興味ある方は、3Q+4Q の「コンピュータサイエンス」を履修してください。

0. 前回までのあらすじ

演習 2-1. (前回の復習) パス名の練習
  1. 以下のパス名 (Mac) は絶対パス名か、相対パス名か?
    /home/shinyama/work
  2. カレントディレクトリが C のとき…
    A B C D E G H H K M カレントディレクトリ
    1. ファイル A への相対パス名を答えよ。
    2. ファイル M への相対パス名を答えよ。
  3. カレントディレクトリを /home/john とする:
    以下のフォルダ・ファイルを描き加えよ:
    home john
    • ./mail.txt (ファイル)
    • /share/ (フォルダ)
    • study/report.txt (ファイル)
    • ../work/exp1.data (ファイル)
    • /home/mary/fig.plot (ファイル)
    • ./study/../../game/ (フォルダ)

雑談

1. matplotlib の基本

1.1. matplotlib とは?

本授業では、おもに a. の方法を利用するが、 b. を使ってもよい (結果は同じである)。

Google Colaboratory を使う場合

  1. Google Colaboratory にログインする。
  2. File メニューから New Notebook を選ぶ。
  3. 以下のような画面が出る。この枠内に文字を入力する。

Jupyter Notebook を使う場合

  1. Jupyter Notebook を起動する。
  2. New Notebook (Python3) を選ぶ。
  3. 以下のような画面が出る。この枠内に文字を入力する。

1.2. グラフを描画する

演習 2-2. 最初のグラフを描画する

Google Colaboratory (あるいは Jupyter Notebook) で 以下のプログラムを入力し、 再生 (あるいは Run) ボタンを押して実行せよ。 (キーボードの Ctrl + Enter でも実行できる。)

ちなみに、この「プログラム」の内容は理解できなくて大丈夫。 基本的に与えられたものをコピー・ペーストすれば動く。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 100)

plt.plot(x, np.sin(x), label="sin(x)")

plt.xlabel("x label")
plt.ylabel("y label")
plt.title("Simple Plot")
plt.legend()
plt.show()

正しく動作していれば、以下のような画面が表れるはずである:

時間に余裕があれば、以下もやってみよう:

演習 2-3. いろいろなグラフを描く
  1. 上のプログラムの中で、以下の行
    plt.plot(x, np.sin(x), label="sin(x)")
    
    を次のように書き換え、結果を観察せよ。
    plt.plot(x, x, label="linear")
    plt.plot(x, x**2, label="quadratic")
    plt.plot(x, x**3, label="cubic")
    
  2. プログラム中の "〜" で囲まれている部分 ("Simple Plot", "x label", "linear" など) を 書き換え、結果を観察せよ。
  3. (さらに時間がある人向け) Matplotlib Gallery にある プログラムをいくつか描画してみよう。

1.3. グラフを画像ファイルとして保存する

上のプログラムに以下の一行を追加すると、 描画したグラフを実際にファイルとして保存 (ダウンロード) することができる。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 100)

plt.plot(x, np.sin(x), label="sin(x)")

plt.xlabel("x label")
plt.ylabel("y label")
plt.title("Simple Plot")
plt.legend()
plt.savefig("sinx.png")
plt.show()

注意: plt.savefig(...) の部分は 必ず plt.show() の前に書くこと。

Google Colaboratory を使う場合

Google Colaboratory は、内部にファイルを持っている。 上のプログラムが正しく動作すると、 sinx.png ファイルが生成される。 これを自分の PC にダウンロードするには、以下のようにする。

  1. 画面の左側の「フォルダ」アイコンをクリックする。
  2. 初期化にしばらく時間がかかるので、10秒ぐらい待つ。
  3. sinx.png というファイルが表示されるので、 右クリックして Download を選ぶ。
  4. ダウンロードしたファイルを PC 上に保存する。

Jupyter Notebook を使う場合

Juypter Notebook では、 画像ファイルは自分のホームフォルダ内に保存されている。 フォルダを開いて sinx.png が生成されていることを確認する。

(なお、作成した Notebook 自体もホームフォルダ内に保存されている。)

演習 2-4. グラフを画像ファイルとして保存

上で描画したグラフの画像ファイル sinx.png を 自分のパソコン上にダウンロードせよ。

2. matplotlib の応用

matplotlib の本当の使い方は sin(x) などのグラフを描くことではなく、 実験データをプロットすることである。ここでは、外部から テキスト形式のデータを与えることで、任意のグラフを描画する。

演習 2-5. データを使ったグラフ描画
  1. 以下のようなテキストファイルを作成し、 これを data1.txt という名前で保存する:
    1 10
    2 40
    3 25
    4 100
    5 60
    
  2. Google Colab を開き、 このテキストファイルを画面左側の ファイル一覧部分にドラッグ・ドロップする。 (こうすると matplotlib のプログラムにファイルを読ませることができる)
    (Jupyter Notebook を使っている場合は、ファイル data1.txt を ホームフォルダ (Notebookファイルが入っているフォルダ) の中に置けばよい。)
  3. 以下のプログラムを matplotlib で入力・実行する:
    import numpy as np
    import matplotlib.pyplot as plt
    
    a = np.genfromtxt("./data1.txt")
    plt.plot(a[:,0], a[:,1], label="data1", color="blue")
    
    a = np.genfromtxt("./data1.txt")
    plt.bar(a[:,0], a[:,1], label="data1", color="red")
    
    plt.title("Simple Plot")
    plt.xlabel("x label")
    plt.ylabel("y label")
    plt.legend()
    plt.savefig("./plot1.png")
    plt.show()
    
    正しく動いていれば、以下のようなグラフが表示されるはずである:
  4. data1.txt を開いて中の値を適当に書き換え、 グラフを再描画させて内容が変化していることを確認する。

2.1. matplotlib のプログラム解説

上の演習 2-5. で使った matplotlib プログラムを簡単に解説する。

まず、最初の2行は、とにかく必要

import numpy as np
import matplotlib.pyplot as plt
次にプロットを描く部分が続く。 これは基本的に、以下の繰り返しである。 まず、どのファイルをデータとして使うか (./data1.txt) を指定し、 そのプロットの名前 (data1)、 および線の色 (blue) を指定している。 ファイルの指定には相対パスが使われる。
a = np.genfromtxt("./data1.txt")
plt.plot(a[:,0], a[:,1], label="data1", color="blue")
次の部分は前とほとんど同じだが、plot の部分が bar に 変わっている。こうすると折れ線グラフではなく、棒グラフが描かれる。
a = np.genfromtxt("./data1.txt")
plt.bar(a[:,0], a[:,1], label="data1", color="red")
最後に、グラフの題名を「Simple Plot」、 X軸、Y軸の表示をそれぞれ「x label」「y label」に設定し、 完成したグラフを ./plot1.png というファイル名で保存する。 このときのファイル名も実は相対パス名である。
plt.title("Simple Plot")
plt.xlabel("x label")
plt.ylabel("y label")
plt.legend()
plt.savefig("./plot1.png")
plt.show()

Excel と matplotlib の違い

2.2. 論文の実験データを使ってグラフを描画する

つぎに、クラス共通課題の 論文で使われる 本物のグラフを作成しよう。 まず、図 5. 「実行時間比較」から始めることにする。

最初に、実験結果をあらわす数値データを自分のパソコン上にダウンロードする。 このファイルは Zip形式 であり、 この中には複数のファイル(フォルダ) が格納されている:

Zip形式とは?

Zip形式のファイルとは、拡張子 .zip をもち、 複数のファイル・フォルダを圧縮した1個のファイルにまとめることができる。 こうすると、ただ1つのファイルを送るだけでよいので メールで送信したりダウンロードしたりするのが楽である。

演習 2-6. 本格的なグラフ描画
  1. ダウンロードした Zip ファイルを開き、 kadai-plot-data というフォルダをデスクトップに移動する。
    (Macの場合は、自動的に開かれる。)
  2. 次に Google Drive を開き、 ここに取り出した kadai-plot-data フォルダをドラッグ・ドロップする。 これにより、フォルダの中身が Google Drive にアップロード (送信) される。

    注意: zipファイル中から直接 kadai-plot-data をドラッグ・ドロップしないこと。 必ず一度、デスクトップ上に出してからでないと、うまく動かない。

  3. ふたたび Google Colab を開き、 「Google Drive アイコン ()」をクリックすると、 ファイル一覧部分に先ほどアップロードした kadai-plot-data フォルダが 表示されているはずである。このフォルダの相対パス名は ./drive/My Drive/kada-plot-data である。
  4. 以下のプログラムを matplotlib で入力・実行する:
    import numpy as np
    import matplotlib.pyplot as plt
    
    a = np.genfromtxt("./drive/My Drive/kadai-plot-data/cnm/etime-size.txt")
    plt.plot(a[:,0], a[:,1], label="CNM", linestyle="-.", color="black")
    
    a = np.genfromtxt("./drive/My Drive/kadai-plot-data/he2/etime-size.txt")
    plt.plot(a[:,0], a[:,1], label="HE'", linestyle=":", color="black")
    
    a = np.genfromtxt("./drive/My Drive/kadai-plot-data/he1/etime-size.txt")
    plt.plot(a[:,0], a[:,1], label="HE", linestyle="--", color="black")
    
    a = np.genfromtxt("./drive/My Drive/kadai-plot-data/hn/etime-size.txt")
    plt.plot(a[:,0], a[:,1], label="HN", linestyle="-", color="black")
    
    plt.xlabel("Size of Social Network")
    plt.ylabel("Elapsed Time [sec]")
    plt.legend()
    plt.show()
    
    正しく動いていれば、以下のようなグラフが表示されるはずである:
  5. Jupyter Notebook の場合、 デスクトップが ./Desktop/ という相対パス名となるため、 たとえばデスクトップ上に kadai-plot-data フォルダがある場合は、 プログラム中の相対パス名を以下のように変更すればよい。
    変更前: a = np.genfromtxt("./drive/My Drive/kadai-plot-data/cnm/etime-size.txt")
    変更後: a = np.genfromtxt("./Desktop/kadai-plot-data/cnm/etime-size.txt")
    

うまく動かない場合

以下のようなエラーが出る場合 (再生ボタンが赤くなる)、 相対パス名 ./drive/My Drive/kadai-plot-data/cnm/etime-size.txt に ファイルが存在しないことを意味する。 このような場合は、kadai-plot-data フォルダが 正しい場所にアップロードされているかどうか確認すること。

3. 本日のまとめ・小課題

小課題2. 論文のグラフ 図6 を描画する (6月28日締切)

演習 2-6. でやったグラフを修正して、以下のようなグラフ (論文の図6) を描け。 このときの matplotlib の プログラム (画像ファイルではない) を テキストファイルとして提出せよ。 ファイル名はなんでもよいが、拡張子は .txt であること。

具体的には、演習 2-6. のグラフを以下のように変更すればよい:

ここで作成した matplotlib のプログラムは、 今後の課題でも利用するので着実に完成させよう。


Yusuke Shinyama