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。