PythonでSciPy(NumPy)とmatplotlibを使って3D散布図を作成する方法です。
サンプルデータはiris.csvを使用(http://aima.cs.berkeley.edu/data/iris.csv)
-
scipy.genformtxtメソッドで、csvファイルのデータを直接scipy.array形式で取り込むことができます。
-
scipy.array形式のデータは普通の配列として扱うことができ、さらにd[d[:,0] >= 7]のように簡単に条件に合うレコードを抽出することができます。複数の条件式を使用する場合はビット演算子で連結します。
-
グラフ描画の際にはscatter3Dメソッドが使えますが、データ数が多いと極端に重くなります。
plotメソッドのほうが良いです。
(5/9追記)plotメソッドではデータの読み込み順にプロットが上書きされていくので、プロットが重なった時に立体的な前後関係がおかしくなります。scatterメソッドは処理が重く、グラフの回転操作に難がありますが、立体的な前後関係はより正確です。
(5/10追記)立体的な重なりがおかしいのはscatterも同様でした。どうもmatplotlibの未解決問題のようです。きれいな3Dグラフ書きたい人はMayaViを使えとのこと。
http://matplotlib.org/mpl_toolkits/mplot3d/faq.html -
plotメソッドのプロパティとして、color(マーカーの色)、ms(Marker Size、マーカーの大きさ)、mew(Marker Edge Width、マーカーの枠線の太さ)などが指定できます。
# coding: UTF-8
from matplotlib import pyplot
from mpl_toolkits.mplot3d import Axes3D
from scipy import genfromtxt
# ファイル読み込み
d = genfromtxt("./temp/iris.csv", delimiter=",")
# グラフ作成
fig = pyplot.figure()
ax = Axes3D(fig)
# 軸ラベルの設定
ax.set_xlabel("X-axis")
ax.set_ylabel("Y-axis")
ax.set_zlabel("Z-axis")
# 表示範囲の設定
ax.set_xlim(4, 8)
ax.set_ylim(2, 5)
ax.set_zlim(1, 8)
# 抽出条件設定
d1 = d[d[:,0] >= 7]
d2 = d[(d[:,0] < 7) & ((d[:,1] > 3) & (d[:,1] <= 3.5))]
d3 = d[(d[:,0] < 7) & ((d[:,1] <= 3) | (d[:,1] > 3.5))]
# グラフ描画
ax.plot(d1[:,0], d1[:,1], d1[:,2], "o", color="#cccccc", ms=4, mew=0.5)
ax.plot(d2[:,0], d2[:,1], d2[:,2], "o", color="#00cccc", ms=4, mew=0.5)
ax.plot(d3[:,0], d3[:,1], d3[:,2], "o", color="#ff0000", ms=4, mew=0.5)
pyplot.show()
出力結果
別ウィンドウが開き、グラフが表示されます。
グラフはドラッグで自由に回転できます。
メニューバーのsaveアイコンで下記のようなpngファイルを出力できます。