matplotlibで散布図を作成

散布図を描画してほしいとの指示が。しかも、要求が多かったので(色分けなどなど)、兼ねてから使いたかったmatplotlibを使って作ってみた。matplotlibのダウンロード、インストール、使い方などは
Matplotlib: Python plotting — Matplotlib 3.1.0 documentation
を参照してください。

作った散布図はこちら↓

今回は、windowsで動かしました。普段はサーバー上でpythonを動かすためにCUIが多いので、matplotlibのGUIにちょっと驚きました。
ソースは以下。

# encoding=UTF-8

from matplotlib.pyplot import *;

C = 4; # クラス数

f = open("data.csv"); # x座標,y座標,色を決める数値 のデータ
datas = f.readlines();
f.close();

MatX = [[] for i in range(C)];
MatY = [[] for i in range(C)];
MatL = [[] for i in range(C)];
MatC = [[] for i in range(C)];
VecL = [];

sum = 0;
for d in datas:
	d2 = d.strip().split(",");
	sum += float(d2[2]);
	VecL.append(float(d2[2]));
	for i in range(1,C+1):
		if int(d2[3]) == i:
			MatX[i-1].append(1.0 - float(d2[0]));
			MatY[i-1].append(float(d2[1]));
			MatL[i-1].append(float(d2[2]));
			
maxL = max([max(v) for v in MatL]);
minL = min([min(v) for v in MatL]);

markers = ['^','d','s','o'];
legends = ['Legend1','Legend2','Legend3','Legend4'];
for i in range(C):
	scatter(MatX[i], MatY[i], marker=markers[i], s=80,\
		alpha=0.95, c=MatL[i], vmin=minL, vmax=maxL, label=legends[i],\
		linewidth=0.5);

xlabel('x-axis');
ylabel('y-axis');
loglog();
colorbar();
legend(shadow=True, loc=2);

show();

シンプルなグラフを作るならば、難しいことは何もないという印象です。ただ、こだわり始めると面倒がおこる。とくに、点に色をつけるところなんて、僕の常識外のことで苦労した。
scatterメソッドのパラメータcの部分で色を決められる。単色(例えば青)なら、c='b'でOK。また、各点ごと、ある値の大きさによって色を変えたいなら、cにベクトルx,yと同じ次元のリストを与えてあげればOK。特に何もしなくても、勝手に正規化してくれて、赤から青へのグラデーションをしてくれる。ただ、逆に言うと、RGBみたいな指定の仕方ができないようで(できたらうれしいんだけど)。

保存形式は、png,svg,eps,pdfなどがある。一般的な話はわからないけど、svgやepsに出力できたのには驚いた。

出力結果を見る限り、論文にも貼れそうな感じだし、なかなか便利です、Matplotlib。