謁見レポート用グラフをPythonで描く
電通大一年にある大敵、基礎科学実験A、通称謁見のレポートを書くにあたって、グラフを載せることがあります。
そのグラフは、LMS上で様式の指定があり、その通りに描く必要があります。
グラフというとExcelを最初に思い浮かべると思います。
私も最初は、Excelで簡単に作れるだろうと思っていましたが、実際に作りかけると、どうも思うような設定項目が見つからず、早々に諦めました。
というのも、Pythonのmatplotlibというモジュールでグラフが描けるということを知っていたからです。
実際に作って上手くいったので、備忘録もかねて、記しておきます。
これができると、グラフ作成の手間がだいぶ減ると思います。
生成するグラフは以下のようなものです。
やること
Pythonインストール
モジュールインストール
CSVファイル生成
pythonコード編集
グラフ保存
Pythonインストール
拡張子表示の設定
超事前準備で、拡張子を表示するように設定しておきます。
エクスプローラを開いて、上の方の「フィルター」の横にある「・・・」、「オプション」をクリックすると、以下の画面が出ると思います。
ここで、「登録されている拡張子は表示しない」のチェックを外しておきます。
次に、pythonをインストールします。
既にインストールされている方は飛ばしてください。
Pythonダウンロード
Pythonをダウンロードします。
このサイトの「Download」にマウスカーソルを置くと出てくる、「Download for Windows」のPython 3.oo.oをクリックして、ダウンロードしてください。(記事執筆時点では3.12.3)
ダウンロードできたら、exeファイルを実行してください。
そうすると、以下のような画面が出てくると思います。
【重要】ここで、下にある、「Add python.exe to PATH」にチェックを入れてください。もし入れ忘れたら、再度インストールしてください。
Install Nowを押して、インストールします。
しばらくすると、インストールが終わり、次の画面が出てくると思います。
これは必須ではないですが、「Disable path length limit」を実行しておくことをお勧めします。意味はそのままの通りです。
実行すると、下のような画面になると思います。
「Close」でインストールダイアログを閉じます。
Python動作確認
Pythonの動作確認をしておきます。
スタートメニューを右クリックし、「ターミナル」からPowerShellを開きます。
PowerShellが開いたら、「python」と入力し、Enterキーを押します。
以下のようになれば、インストール成功です。
ここでは、pythonを実行できます。
試しに、
print('Hello World!')
と入力して実行(Enter)してみましょう。
Hello World! と出力されたはずです。
この時点で、あなたはpythonを書き、実行したことになります。
pythonデビュー、おめでとうございます!
PowerShellの、この状態は、pythonを実行する状態にあります。
exit()
を実行すると、元のPowerShellに戻ります。
モジュールインストール
次に、グラフ生成に必要なモジュールをインストールします。
PowerShellを開き、以下のコマンドを順に一つずつ実行します。
matplotlib
重要なグラフ表示をするために必要なモジュールです。
pip install matplotlib
実行すると以下のようになると思います。
こうなったら、インストール成功です。
pandas
csvファイルからデータを取ってくるときに使います。
これも同じ要領です。
pip install pandas
以上でモジュールのインストールが完了しました。
CSVファイル生成
グラフにプロットするためのデータをpythonに渡すのに、csvファイルを使用します。
聞きなれないかもしれませんが、「comma separated values」の略で、コンマで区切られたファイルのことです。
普通のテキストエディタで編集ができます。
作りたいcsvファイルは以下のようなものです。
1,1
2,4
3,9
4,16
5,25
...
一列目にx(横軸)の値、二列目にy(縦軸)の値が入るようにします。
それを、必要なデータ分入力しておきます。
テキストエディタで直打ちし、保存してもいいですが、Excelでデータ管理していると思うので、Excelから出力しようと思います。
このようなデータを新規ブックか新規シートで作ります。
この時、A列にx(横軸)の値、B列にy(縦軸)の値を入れるようにします。
また、使いたい値が関数によって生成されているときは、コピーするときに「貼り付けのオプション:」から「値」を選ぶと値がコピーできます。
ここで、新規シートで作った場合は、当該ブックを保存しておきます。
csvファイルを出力するには、「ファイル」、「名前を付けて保存」、「参照」から、ファイル保存ダイアログで、「ファイルの種類」を 「CSV UTF-8(コンマ区切り) (*.csv)」にします。
保存先は適当に設定し、保存してください。
この時、ブックに違うシートが含まれている場合、ダイアログが出て、聞かれると思いますが、該当シートが表示してあれば、その値がcsvに出力されます。
pythonコード編集
事前準備
最初に、pythonの編集エディタを開きます。
適当なフォルダ(先に作ったcsvファイルのあるところが良い)で、新規ファイルを作り、名前を「~.py」にします(~は英字を推奨)。
また、フォルダ名のパス(エクスプローラの上の「~ > ~ > ~」のところをクリックすると見れる)に、日本語や空白が混ざっていると実行できないことがあります。
できるだけ、英字のみにしてください。
特に、onedriveを使っていると日本語が入ってたりします。
生成したpythonファイルを右クリックし、「その他のオプションを確認」、「Edit with IDLE」「Edit with IDLE 3.oo (64-bit)」の順に選択していきます。
※「Edit with IDLE」が表示されない場合は、一度「プログラムから開く」、「Python」を実行すると表示されるかもしれません。
そうすると、以下のようなエディタが出てくると思います。
ここで、pythonのコードを書きます。
vscodeなどでも、もちろん編集、実行できます。
興味があれば、調べてみてください。
確か、pythonファイルをvscodeで開くとpython拡張機能をインストールみたいなのが出てきて、それをインストールするとできた気がします。
このIDLEに、
print('Hello World!')
と入力し、F5を押すと保存するか?というダイアログが出てきて、OKを押して保存すると、実行されます。
グラフ生成コード編集
さて、事前準備が終わりました。
これから、コードを書いていきます。
大まかなコードはコピペして、少しずつ編集していきます。
ということで、テンプレコードです。
import matplotlib.pyplot as plt
import pandas as pd
#フォント設定
plt.rcParams['font.family'] = 'Times New Roman' # font familyの設定
#plt.rcParams['mathtext.fontset'] = 'stix' # math fontの設定
plt.rcParams["font.size"] = 10 # 全体のフォントサイズが変更されます。
#plt.rcParams['xtick.labelsize'] = 9 # 軸だけ変更されます。
#plt.rcParams['ytick.labelsize'] = 24 # 軸だけ変更されます
#軸設定
plt.rcParams['xtick.direction'] = 'in' #x軸の目盛りの向き
plt.rcParams['ytick.direction'] = 'in' #y軸の目盛りの向き
#plt.rcParams['axes.grid'] = True # グリッドの作成
#plt.rcParams['grid.linestyle']='--' #グリッドの線種
plt.rcParams["xtick.minor.visible"] = True #x軸補助目盛りの追加
plt.rcParams["ytick.minor.visible"] = True #y軸補助目盛りの追加
#plt.rcParams['xtick.top'] = True #x軸の上部目盛り
#plt.rcParams['ytick.right'] = True #y軸の右部目盛り
#軸大きさ
#plt.rcParams["xtick.major.width"] = 1.0 #x軸主目盛り線の線幅
#plt.rcParams["ytick.major.width"] = 1.0 #y軸主目盛り線の線幅
#plt.rcParams["xtick.minor.width"] = 1.0 #x軸補助目盛り線の線幅
#plt.rcParams["ytick.minor.width"] = 1.0 #y軸補助目盛り線の線幅
#plt.rcParams["xtick.major.size"] = 10 #x軸主目盛り線の長さ
#plt.rcParams["ytick.major.size"] = 10 #y軸主目盛り線の長さ
#plt.rcParams["xtick.minor.size"] = 5 #x軸補助目盛り線の長さ
#plt.rcParams["ytick.minor.size"] = 5 #y軸補助目盛り線の長さ
#plt.rcParams["axes.linewidth"] = 1.0 #囲みの太さ
#凡例設定
plt.rcParams["legend.fancybox"] = False # 丸角OFF
plt.rcParams["legend.framealpha"] = 1 # 透明度の指定、0で塗りつぶしなし
plt.rcParams["legend.edgecolor"] = 'black' # edgeの色を変更
plt.rcParams["legend.markerscale"] = 5 #markerサイズの倍率
plt.rcParams['lines.linewidth'] = 0
plt.rcParams['lines.linestyle'] = ''
plt.rcParams['lines.marker'] = '.'
input_csv = pd.read_csv('./input_csv_file.csv', header=None) #********使用するcsvファイルの指定********
first_column_data = input_csv[0]
second_column_data = input_csv[1]
plt.xlim(0, 25) #********x軸の範囲(最小値,最大値)********
plt.ylim(0, 500) #********y軸の範囲(最小値,最大値)********
#plt.figure(dpi=300)
plt.plot(first_column_data, second_column_data, markeredgecolor='k')
plt.xlabel("x") #********x軸ラベルの指定********
plt.ylabel("y") #********y軸ラベルの指定********
#plt.legend()
plt.show()
このコードは、csvファイルの値を、プロットするものです。
これを、IDLEにコピペします。
#********~~~********のところを、主に編集していくことになります。
まずは、csvファイルの指定です。
このテンプレの場合だと、pythonファイルと同じフォルダにある、「input_csv_file.csv」を参照します。
まずはここの「input_csv_file」のところを、先ほど作ったcsvファイルの名前にします。
pythonファイルとcsvファイルは同じフォルダにあると、理解がしやすいと思います。
次に、軸ラベルの設定です。
テンプレでは、x軸ラベルは「x」、y軸ラベルは「y」となっているので、ここを、自分の使いたいように編集していきます。
ここのラベルの書式について、軽く触れておきます。
LaTeXみたいに書きますが、文法は違います。
斜体は、「\mathit{V}」でVの斜体。
平均値バー(?)は、「\overline{V}」でVのバー。
これらは、「$\overline{\mathit{V}}$」のように、$で囲みます。
もちろん上記のように、組み合わせもできます。
例として、以下のような感じで書けます。
plt.ylabel("$\overline{\mathit{I}}$/nA")
グラフ生成&保存
いよいよグラフを表示します。
F5を押して実行しましょう。
そうすると、グラフが表示されると思います。
これが、生成したグラフです。
上手くいかなかったら、どこがダメなのか、探ってみましょう。
値がおかしければ、csvを見てみましょう。
そもそもプロットした点が見つからなければ、範囲をもう一度見てみましょう。
表示されたグラフのウィンドウの中央下の辺に、💾のような、フロッピーディスクのアイコンの、保存ボタンがあります。
そこをクリックすると、ファイル選択ダイアログが出てくるので、適当なフォルダに、適当な名前を付けて保存しましょう。
そうすると、pngファイルが保存されます。
あとはこれをLaTeXに埋め込むだけです。
応用1:近似直線、曲線を入れる
近似直線、曲線を入れれます。
一番最初のimportの所を以下のように変えます。(追記:2024/05/14 23:53)
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
凡例設定を以下のように変えます。
#凡例設定
plt.rcParams["legend.fancybox"] = False # 丸角OFF
plt.rcParams["legend.framealpha"] = 1 # 透明度の指定、0で塗りつぶしなし
plt.rcParams["legend.edgecolor"] = 'black' # edgeの色を変更
plt.rcParams["legend.markerscale"] = 5 #markerサイズの倍率
plt.rcParams['lines.linewidth'] = 1
plt.rcParams['lines.linestyle'] = '-'
plt.rcParams['lines.marker'] = '.'
そして、以下のようなコードを追加します。
x = np.arange(0, 50, 0.1)
y = 2 * x - 1
plt.plot(x, y, marker='', color='c')
コード解説
x = np.arange(0, 50, 0.1)
これがxの定義域のようなものです。この例だと、0から50の間を0.1刻みで生成します。
y = 2 * x - 1
入れたい方程式を書きます。
この例だと、y=2x-1の直線を書きます。
plt.plot(x, y, marker='', color='c')
グラフに入れます。
マーカーを消すことで、線だけにしています。
応用2:複数のデータを一つのグラフにする
まず、凡例設定を以下のように変えます。
#凡例設定
plt.rcParams["legend.fancybox"] = False # 丸角OFF
plt.rcParams["legend.framealpha"] = 1 # 透明度の指定、0で塗りつぶしなし
plt.rcParams["legend.edgecolor"] = 'black' # edgeの色を変更
plt.rcParams["legend.markerscale"] = 1 #markerサイズの倍率
そして、以下のようなコードを書きます。
r_input_csv = pd.read_csv('./Red_ave_py.csv', header=None)
r_first_column_data = r_input_csv[0]
r_second_column_data = r_input_csv[1]
o_input_csv = pd.read_csv('./Orange_ave_py.csv', header=None)
o_first_column_data = o_input_csv[0]
o_second_column_data = o_input_csv[1]
y_input_csv = pd.read_csv('./Yellow_ave_py.csv', header=None)
y_first_column_data = y_input_csv[0]
y_second_column_data = y_input_csv[1]
b_input_csv = pd.read_csv('./Blue_ave_py.csv', header=None)
b_first_column_data = b_input_csv[0]
b_second_column_data = b_input_csv[1]
plt.xlim(0, 1.6)
plt.ylim(0, 1200)
plt.scatter(r_first_column_data, r_second_column_data, s=15, marker='o', c='w', ec='k', label='赤色')
plt.scatter(o_first_column_data, o_second_column_data, s=15, marker=',', c='w', ec='k', label='オレンジ色')
plt.scatter(y_first_column_data, y_second_column_data, s=15, marker='^', c='w', ec='k', label='黄色')
plt.scatter(b_first_column_data, b_second_column_data, s=15, marker='v', c='w', ec='k', label='青色')
plt.xlabel("$\it{V}$/V")
plt.ylabel("$\mathregular{\overline{\mathit{I}}}$/nA")
plt.legend(prop={'family':'Yu Gothic'})
input_csv, first_column_data, second_column_dataのひとかたまりを量産する感じです。変数が被ると上書きされてしまうので、r_input_csv, r_first_column_data, r_second_column_dataのように、区別させておきます。
plt.scatterもデータ数分用意します。
marker='o'のところで、','などにすると、プロットの形が変わります。
label='赤色'のようにすると、凡例で表示されます。
plt.legendが、凡例の表示命令です。
The Times Romanだと、日本語出力できないため、フォントも変えています。
おまけ:LaTeXに埋め込み
主題とは外れますが、LaTeXへの埋め込みの仕方も一応載せておきます。
texファイルと同じフォルダにpngファイルを入れておきます。
\begin{figure}[H]
\centering
\includegraphics[width=12cm]{figure.png}
\caption{図の説明}
\end{figure}
この例だと、figure.pngを読み込んでいます。
適宜、ファイル名を変更してください。
\caption で、図の下につく説明を編集します。
「width=12cm」のところは、いろいろ試して、自分が設定したい図の大きさに設定してください。
大きすぎて入らなかったり、小さすぎて見えなかったりする時があります。
また、環境によっては、[H] のところでエラーが出るかもしれないです。
そのときは、LaTeXインストール時に参考にしたサイトに従うのが一番楽です。
最後に
あとは、自分の作りたいようにいじってみてください。
凡例の辺をいじると、グラフの見た目が変わります。
調べたいときは、「matplotlib」を最初につけてググると調べたい情報が出てくると思います。
chatGPTも活用してみてください。
pythonは今回の時みたいに、目的が出てきてからその時に調べて書いてきた素人が、作ってますのでバグがあるかと思います。
無事できたら、一言でもいいので伝えてくれると泣いて喜びます。
エラーもできる限り対応したいと思っています。
プロへ
素人が作ってます。
ここはこうした方が良いとかあったらなんでも言ってください。