卒論グラフをPythonで作る#Matplotlib

Python

はじめに

理系大学を卒業するにあたって、だれもが避けては通れない(?)卒業論文を書くのにあたって書いたコードについて解説しようと思います。
基本的に独学で勉強したため、冗長なコードである、間違った解釈をしている可能性が高いです。そんなときはコメントで遠慮なくご指摘してください。

 

今回の投稿は以前の投稿をフォークした内容になります。
https://qiita.com/floris_ryo/items/9420725872b90599406e

また、pythonをほとんど知らない人想定で書いています。

下準備

anacondaのSpyderで実装しました、変数内が見えるのでデータ解析などではおすすめのエディターです。

 

データの読み込み

今回はexcelファイルにあるデータからグラフを作ることを想定します。
また、同じDirectry(ファイル内)にtest.xlsxがあるとして話を進めていきます。

 

test.xlsxには以下のように情報が入っています。(データはxが0.01から0.01刻みで100まで、y1=10x,y2=x^2,y3=sinx,y4=tanx)

これをPython上に情報をロードします。
以下のようにして、python内にエクセルファイルの情報を読み込めます。

#ライブラリの設定
import pandas as pd
#データロード
df = pd.read_excel("test.xlsx")

このとき、Spyderで変数内を確認すると以下のようになっています。

グラフの作成

フォント関連について

次に実際にグラフを書いてみようと思います。理系のグラフとしてはフォントがTimes new roman、グラフの目盛りの向きが内側なので


import matplotlib.pyplot as plt
#フォント関連

#フォント一括でTimes New Romanに
plt.rcParams['font.family'] = 'Times New Roman'
#フォントサイズを20に
plt.rcParams["font.size"] = 18
#メモリ線を内側に
plt.rcParams['ytick.direction'] = 'in'
#メモリ線を内側に
plt.rcParams['xtick.direction'] = 'in'
#上部に目盛り線を描く
plt.rcParams["xtick.top"] = True 
#右部に目盛り線を描く
plt.rcParams["ytick.right"] = True

1枚のグラフを作成する

Excel上の一行目に、x,y1,y2…と書いたがこれをインデックスと呼ぶ。今回はx-y1(一行目と二行目)でグラフを書いてみようと思います。

#プロット
plt.scatter(df.iloc[:,0],df.iloc[:,1],c="white",linewidths="1",edgecolors="red")
#plt.scatter(df["x"],df["y1"],c="white",linewidths="1",edgecolors="red")でも可…(1)
#x軸のタイトル
plt.xlabel("x")
#y軸のタイトル
plt.ylabel("y=10x")
plt.show()

plt.scattterの中身について解説すると、plt.scatter(x軸 , y軸 , color = 色 , linewidths = 輪郭線の太さ , edgecolors = 輪郭線の色)となっています。

軸の指定の仕方は二種類あり、今回はdf.iloc[行,列]で指定しています。

x軸の指定の仕方を説明すると、1列目,行は最終行までを指定しているため、df.iloc[全部,1列目]となります。pythonは0から数字が始まるため、df.iloc[:,0]となります。

また、インデックスを指定して(1)のように書くこともできます。

これで次のような画像のグラフが生成されます。

これを線グラフにしたいときは

plt.plot(df["x"],df["y"])

で表示されます。また、logスケールで表記したいときはこのサイトを参考にしてください。

matplotlib ログスケール表示とグリッド表示

 

複数のグラフをプロット

まず、それぞれのグラフの左上に(a),(b)…といった区別をつけるために名前のリストのlistを作成します。また、それぞれのy軸タイトルも作っておきます。

#(a)~(z)の名前リスト
abc = ["(" + chr(ord('a') + i) + ")" for i in range(26)]
#y軸のタイトル
ytitle = ["y = 10x","y = x^2","y = sinx","y = tanx"]

次に描写の部分を示します。

#全体のグラフの大きさplt.figure(figsize = (横,縦))
plt.figure(figsize = (16,12))


for i in range(4):
    #中のグラフの位置決め
    #subplot(縦に何個並べるか,横に何個並べるか,左上から1.2...としたときの位置)
    plt.subplot(2,2,i+1)
    #左上に(a)...を示す
    plt.title(abc[i],loc="left")
    plt.scatter(df.iloc[:,0],df.iloc[:,i+1],c="white",linewidths="1",edgecolors="red")
    plt.xlabel("x")
    plt.ylabel(ytitle[i])

#万能コマンド 文字がかぶらないようにしてくれる
plt.tight_layout()

rangeの中はデータ数です。これで表示されるグラフは次のようになります。

複数のデータを同じグラフ内に

それぞれのグラフの色を指定するリストを作ったあとsubplot()を入れずにscatter(plot)していくことで描写できる。

#色の指定
color = ["red","blue","green","purple","aqua"]

plt.figure()

for i in range(4):
    plt.plot(df.iloc[:,0],df.iloc[:,i+1],c=color[i],label = ytitle[i])
    plt.ylabel("yaxis")
    plt.xlabel("xaxis")

plt.legend(loc = "best",fontsize = 15)

次のように表示されます。

自分用メモ書き

上付き文字などLaTeX表記したいとき

plt.rcParams['mathtext.default'] = 'default'
plt.rcParams['mathtext.fontset'] = 'stix'
#例
molname = ['$H_2O$',"$CO_2$","$CH_4$","$CO$","$N_2O$","$NO$","$O_3$","$HCl$"]

横に凡例を並べる

plt.legend(fontsize = 16,loc='upper right',ncol=4)

logスケールのグラフを整数で表す

plt.gca().xaxis.set_major_formatter(matplotlib.ticker.ScalarFormatter())
plt.gca().xaxis.set_minor_formatter(matplotlib.ticker.ScalarFormatter())

x軸を上下にそれぞれとる

fig = plt.figure()
ax1 = fig.subplots()
ax2 = ax1.twinx()
ax1.plot(...)
ax2.plot(...)

全部のコード

# -*- coding: utf-8 -*-


#ライブラリの設定
import matplotlib.pyplot as plt 
import pandas as pd

#データロード
df = pd.read_excel("test.xlsx")

#フォント関連
#フォント一括でTimes New Romanに
plt.rcParams['font.family'] = 'Times New Roman'
#フォントサイズを20に
plt.rcParams["font.size"] = 20
#メモリ線を内側に 
plt.rcParams['ytick.direction'] = 'in' 
#メモリ線を内側に 
plt.rcParams['xtick.direction'] = 'in' 
#上部に目盛り線を描く 
plt.rcParams["xtick.top"] = True 
#右部に目盛り線を描く 
plt.rcParams["ytick.right"] = True

"""
プロット一つ
"""

#プロット
plt.scatter(df["x"],df["y1"],c="white",linewidths="1",edgecolors="red")
#plt.scatter(df.iloc[:,0],df.iloc[:,1],c="white",linewidths="1",edgecolors="red")でも可能
#df.ilocはdf.iloc[行数,列数]で指定する。
plt.xlabel("x")
plt.ylabel("y = 10x")
plt.show()
"""
プロット複数
"""

#(a)~(z)の名前リスト
abc = ["(" + chr(ord('a') + i) + ")" for i in range(26)]
#y軸のタイトル
ytitle = ["y = 10x","y = x^2","y = sinx","y = tanx"]

#全体のグラフの大きさplt.figure(figsize = (横,縦))
plt.figure(figsize = (16,12))


for i in range(4):
    #中のグラフの位置決め
    #subplot(縦に何個並べるか,横に何個並べるか,左上から1.2...としたときの位置)
    plt.subplot(2,2,i+1)
    #左上に(a)...を示す
    plt.title(abc[i],loc="left")
    plt.scatter(df.iloc[:,0],df.iloc[:,i+1],c="white",linewidths="1",edgecolors="red")
    plt.xlabel("x")
    plt.ylabel(ytitle[i])

#万能コマンド 文字がかぶらないようにしてくれる
plt.tight_layout()

plt.show()
"""
複数のデータを同じグラフ内に
"""
#色の指定
color = ["red","blue","green","purple","aqua"]

plt.figure()

for i in range(4):
    plt.plot(df.iloc[:,0],df.iloc[:,i+1],c=color[i],label = ytitle[i])
    plt.ylabel("yaxis")
    plt.xlabel("xaxis")

plt.legend(loc = "best",fontsize = 15)
plt.show()

コメント

タイトルとURLをコピーしました