見出し画像

【Blender Python】CSVファイルを読み込んで3D散布図を描く

Blenderをデータ可視化ツールとして使えないか、いろいろと検討しています。

今回はCSVファイルを読み込んで、3D散布図を描いてみようと思います。
Blenderのバージョンは2.93 LTSです。

1. カレントディレクトリ

相対パスでファイルの場所を指定する場合、カレントディレクトリがどこなのか知る必要があります。

Pythonでカレントディレクトリを調べるコードは

import os
print(os.getcwd())

です。

blender.exe をダブルクリックしてBlenderを起動した場合は blender.exe があるフォルダがカレントディレクトリとなり、~.blend ファイルをダブルクリックしてBlenderを起動した場合はそのblendファイルがあるフォルダがカレントディレクトリとなります。

なので、起動の仕方によらずPythonスクリプトを正常に動作させるためには、スクリプトの中に読み込みたいファイルのパスを明示しておいた方が良いでしょう。

2. CSVファイルを用意する

今回は身近にあったCSVファイルということで、統計解析ソフトRに入っているirisデータをCSV出力して使っていきたいと思います。

irisデータをCSV出力するRスクリプトは

write.csv(iris, 'iris.csv', row.names=FALSE)

です。

出力したCSVファイルの中身はこのようになっています。

画像1

1行目が見出し行になっています。

3. CSVを読み込み中身を表示する

まずはこのCSVファイルが読み込めるか試してみましょう。

CSVファイルを読み込んで、1行ずつprintするPythonスクリプトを書いてみます。

import os
import csv


# CSVがあるフォルダ
base_dir = 'C:\\Users\\mare_ism\\Documents'

with open(os.path.join(base_dir, 'iris.csv')) as f:
   reader = csv.reader(f)
   for row in reader:
       print(row)

このスクリプトを実行すると、

画像2

このように、CSVの中身が表示されました。

4. 3D散布図を描く

CSVファイルの読み込みができたので、あとは読み込んだデータを使ってオブジェクトを配置していけばいいですね。

import os
import csv
import bpy


# 既存のメッシュオブジェクトを削除
for msh in bpy.data.meshes:
   bpy.data.meshes.remove(msh)

# 既存のマテリアルを削除
for mat in bpy.data.materials:
   bpy.data.materials.remove(mat)


# CSVがあるフォルダ
base_dir = 'C:\\Users\\mare_ism\\Documents'


# 新規マテリアルを作成
mat_r = bpy.data.materials.new('red')
mat_r.diffuse_color = (1.0, 0.0, 0.0, 1.0)

mat_g = bpy.data.materials.new('green')
mat_g.diffuse_color = (0.0, 1.0, 0.0, 1.0)

mat_b = bpy.data.materials.new('blue')
mat_b.diffuse_color = (0.0, 0.0, 1.0, 1.0)


# CSVを読み込み
with open(os.path.join(base_dir, 'iris.csv')) as f:
   # 1行目は処理を飛ばす
   next(f)
   reader = csv.reader(f)
   for row in reader:
       # x軸にSepal.Length、y軸にSepal.Width、z軸にPetal.Lengthを指定して
       # 球体を配置する
       bpy.ops.mesh.primitive_ico_sphere_add(
           location=(float(row[0]), float(row[1]), float(row[2])),
           radius=0.08, subdivisions=5)
       # Speciesごとに色分けする
       if row[4] == 'setosa':
           bpy.context.object.data.materials.append(mat_r)
       elif row[4] == 'versicolor':
           bpy.context.object.data.materials.append(mat_g)
       elif row[4] == 'virginica':
           bpy.context.object.data.materials.append(mat_b)

このPythonスクリプトを実行すると、

画像3

このように3D散布図を描くことができました。

5. さらに応用

データの値に応じてメッシュオブジェクトの種類を立方体や三角錐に変えたり、radiusの値を変化させて3Dバブルチャートにするなど、いろいろな表現ができそうですね。

まとめ

CSVファイルを読み込んで3D散布図を描く方法を紹介しました。

実用的なグラフにするには軸も描かないといけませんが、Blender外で作成したデータを使ってオブジェクトを操作するというのはいろんな応用ができそうです。

この記事が気に入ったらサポートをしてみませんか?