散布図
散布図を描いてみる。図1は、2018年6月4日の日本気象協会によるアメダスの各地の最高気温と最低気温のデータから作成したExcelデータである。
・
・
・
図1
図1のデータは、1行目に変数名を設定していて、データ値は2行目以降に書かれている。1列目は各データの識別値(図1では地名、文字列でも通し番号でもよい)が書かれ、2列目と3列目に各データ対の値が設定されている。図1の形式のデータを読み込んで散布図を描くスクリプトをリスト1に示す。サンプルスクリプトファイルなどはまとめて圧縮ファイルfilesscatterplot.zipとしている。ダウンロード解凍すれば自由に利用できる。リスト1のスクリプトを実行すると、入力データファイル名の設定を求める図2のダイアログウィンドウが表示される。
図2
図2では、図1のファイル名が設定されている。ファイル名を設定して「開く」ボタンをクリックすると図3のダイアログウィンドウが表示される。
図3
描画画像を保存するファイル名(図3では「MyFig.png」と設定されている。ファイル拡張子が「.png」であれば任意である)を設定して「保存」ボタンをクリックすると、散布図が描画されて、図4のように表示される。
図4
図4の散布図において、都市名も表示されていると分かりやすい。このラベル付きの散布図を描くスクリプトをリスト2に示す。
リスト2の実行方法は、リスト1の場合と同じである。リスト2の場合の散布図は図5のようになる。
図5
リスト1 散布描画スクリプト例(ScatterPlot.py)
import tkinter as tk
import tkinter.filedialog as fd
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
def askinfilename(msg = None, types =
[('', '*.*')]):
"""
入力用ファイル名の設定
"""
rt = tk.Tk()
rt.withdraw()
flnm =
fd.askopenfilename(title = msg, filetypes = types)
rt.destroy()
return flnm
def askoutfilename(msg = None, types =
[('', '*.*')], deftype = '.txt'):
"""
出力用ファイル名の設定
"""
rt = tk.Tk()
rt.withdraw()
flnm =
fd.asksaveasfilename(title = msg, filetypes = types,
defaultextension = deftype)
rt.destroy()
return flnm
finnm = askinfilename('入力データExcelファイル', types = [('Excel(*.xlsx)', '*.xlsx')])
foutnm = askoutfilename(msg = '画像保存ファイル', types = [('画像 (*.png)', '*.png')],
deftype = '.png')
xlsx_fl = pd.ExcelFile(finnm)
data_xlsx =
pd.read_excel(xlsx_fl, header =
None)
data = data_xlsx.values
x_name = data[0, 1]
y_name = data[0, 2]
x_values = data[1:, 1]
y_values = data[1:, 2]
print(x_name)
print(x_values)
print(y_name)
print(y_values)
# 日本語表記の設定
plt.rcParams['font.family'] = ['Yu
Gothic', 'Noto Sans CJK JP', 'Hiragino Maru Gothic Pro']
plt.figure(figsize = (8, 7))
plt.xlabel(x_name, fontsize = 16)
plt.ylabel(y_name, fontsize = 16)
plt.plot(x_values, y_values, 'bo')
plt.savefig(foutnm)
plt.show()
リスト2 散布図(ラベル付き)描画スクリプト例(ScatterPlotLabel.py)
import tkinter as tk
import tkinter.filedialog as fd
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
def askinfilename(msg = None, types =
[('', '*.*')]):
"""
入力用ファイル名の設定
"""
rt = tk.Tk()
rt.withdraw()
flnm =
fd.askopenfilename(title = msg, filetypes = types)
rt.destroy()
return flnm
def askoutfilename(msg = None, types =
[('', '*.*')], deftype = '.txt'):
"""
出力用ファイル名の設定
"""
rt = tk.Tk()
rt.withdraw()
flnm =
fd.asksaveasfilename(title = msg, filetypes = types,
defaultextension = deftype)
rt.destroy()
return flnm
finnm = askinfilename('入力データExcelファイル', types = [('Excel(*.xlsx)', '*.xlsx')])
foutnm = askoutfilename(msg = '画像保存ファイル', types = [('画像 (*.png)', '*.png')],
deftype = '.png')
xlsx_fl = pd.ExcelFile(finnm)
data_xlsx =
pd.read_excel(xlsx_fl, header =
None)
data = data_xlsx.values
x_name = data[0, 1]
y_name = data[0, 2]
caseLabels = data[1:, 0]
x_values = data[1:, 1]
y_values = data[1:, 2]
print('Labels')
print(caseLabels)
print(x_name)
print(x_values)
print(y_name)
print(y_values)
# 日本語表記の設定
plt.rcParams['font.family'] = ['Yu
Gothic', 'Noto Sans CJK JP', 'Hiragino Maru Gothic Pro']
plt.figure(figsize = (10, 8))
plt.xlabel(x_name, fontsize = 16)
plt.ylabel(y_name, fontsize = 16)
#
# 点のプロット
#
plt.plot(x_values, y_values, 'bo',
alpha = 0.6)
#
# 名前のプロット
#
for v_c, v_x, v_y in zip(caseLabels,
x_values, y_values):
plt.text(v_x + 0.1, v_y +
0.1, v_c, color = 'b', fontsize = 12)
plt.savefig(foutnm)
plt.show()