はじめに
理系大学を卒業するにあたって、だれもが避けては通れない(?)卒業論文を書くのにあたって書いたコードについて解説しようと思います。
基本的に独学で勉強したため、冗長なコードである、間違った解釈をしている可能性が高いです。そんなときはコメントで遠慮なくご指摘してください。
今回の投稿は以前の投稿をフォークした内容になります。
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スケールで表記したいときはこのサイトを参考にしてください。
複数のグラフをプロット
まず、それぞれのグラフの左上に(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()
コメント