LoginSignup
63
61

More than 5 years have passed since last update.

SciPy+matplotlibで3D散布図を作成(Python)

Last updated at Posted at 2013-05-02

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、マーカーの枠線の太さ)などが指定できます。

plot3d.py
# 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ファイルを出力できます。

出力

63
61
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
63
61