PR

【三次元散布図】pythonならExcelで作るのがきつい三次元散布図の作り方徹底解説

python-3dplot-matplotlib

 今回は3次元散布図の作り方についてご紹介します。2次元散布図はエクセルで簡単に作成可能ですよね。

 例えばこんな感じ。↓これはエクセルで描いた2次元散布図です。

エクセルで描画した2次元散布図
エクセルで描いた2次元散布図

文字通り、二次元散布図は2つのパラメータ散布図にしたもの。つまり二次元のパラメータを散布図にするだけで相関関係を出せればそれで終わりになります。

 ただし、散布図を使うときに、2つのパラメータ以外に

「もう一個パラメータを追加したい….」

 ときもあると思います。
主に解析やられてる方向けですね。

 3次元散布図のメリットは3つのパラメータを使って相関関係を調べられること。
今までの2つのパラメータ以外に、
どこかのパラメータが影響しているのでは….と予想されるときに、
傾向を発見するときに重要になります。

 ただ、エクセルではできない。(簡単には)ところが、「pythonなら一瞬で」できてしまうんです….

そんなこと言われたらやるしかないですよね!!!

この記事を読むことでわかること

Pythonで三次元散布図が書けるようになる。

自己紹介

東証一部上場企業でサラリーマンしてます。

主に工場(生産現場)で使用する検査装置のアプリケーション開発してます。

ヒトの作業を自動化して簡略化するアプリケーションを日々開発中。

転職に成功して現在は超大手企業でシステム系の開発をしています。

Youtubeチャンネルにさまざまな動画を上げています

↓↓↓こちらからYoutubeチャンネルにアクセス!! ↓↓↓

↓↓↓↓これまでのPythonの記事についてはこちら↓↓↓↓

3次元散布図に必要なのはmatplotlib。

 pythonは数値計算やディープラーニングなど、手軽に使えるライブラリが豊富というのが使用するときのメリットの1つです。

 今回もその手軽に使えるライブラリが活躍します。三次元散布図を作るには、matplotlibというライブラリを使用します。

 まだ使ったことない。という場合は、
このようにpipしておきましょう。pipとは、ライブラリを使えるようにするコマンドです。

pip install matplotlib

 他のライブラリをインストールしたことがあれば、なにも難しいことはありませんよね。お使いのpythonのエディタのコンソールに書き込んで実行するだけです。

 pipして使えるようにしたmatplotlibですが、グラフを描くならこれ!というくらい超有名です。
三次元散布図に限らず、二次元でもグラフを描くこともでき、
豊富なグラフ作成が可能な便利なライブラリです。

 特にpythonを使って解析をやっている人だとほぼ必須のライブラリです。
そのほか、有用なライブラリがたくさんありますが、1つ必須のライブラリを紹介しておくと、numpyが特に有用です。
以前書いた記事でnumpyについて紹介しているので参考にしてみてください。

 三次元散布図が表示されるイメージですが、matplotlibで作った3次元プロットの一例を張っておきます。

 これでなんとなくイメージが付くと思います。

matplotlibを使って三次元散布図を作成
3次元散布図

 ちなみに起動させると、マウスでつかんでぐるぐるグラフを回転させることが可能です。こっちの方向から見たら…なんてこともその場で可能です。

こんなふうに相関関係がありますよ、と他の人に説明するときに便利ですね。

matplotlibでとりあえずプロットしてみる。

1点だけ三次元で表示
1点だけ3次元でプロットしてみた結果

 とりあえずプロットしてみないとよくわからないと思うので、もっともシンプルな感じでプロットしてみましょう。

 こちらのソースコードをコピーして起動させてみてください。

import matplotlib.pyplot as mplot

fig=mplot.figure()
ax=fig.add_subplot(projection='3d')
ax.scatter(1,1,1)
mplot.show()

 上記のソースを起動すると、x,y,zそれぞれ1の位置でプロットされていることがわかると思います。
起動させてやってもらいたいのは、グラフをクリックしてぐるぐる回すことです。

 見え方がリアルタイムで変わるので、結構楽しいです。
上記ソースコードの解説ですが、

import matplotlib.pyplot as mplot

 ここで、matplotlibのpyplotを使えるようにimportしています。importとは、宣言のようなもので、これからmatplotlibを使いますよと教えてあげています。このimportを書いてあげないとmatplotlibは使えません。
加えて、先ほどのmatplotlibのインストールが完了していなければこの行でエラーになります。

fig=mplot.figure()
ax=fig.add_subplot(projection='3d')

 ここでは、各種定義をしています。
figという変数にpyplotの図を指定しています。次にaxに3dの軸を指定しています。

 axはaxisの略ですね。

ax.scatter(1,1,1)
mplot.show()

 3dで指定したaxに実際にx=1,y=1,z=1の点をプロットして、
最後にshow()をしています。このshowをするとグラフを画面上にポップアップで表示してくれます。

より実戦に近い形(CSVデータ)でプロットしてみる。

 そもそも1点だけソースコード上に数値を指定してプロットさせることなんて、
現実問題そんなシチュエーションないですよね。

 というわけで、より実践的な使い方として、csvファイルを読み込んで、そのファイルの中身を3次元プロットしてみます。
csvの読み込みはなんでもできますが、今回はnumpyを使用します。

 numpyは、数値データを扱ううえで使用頻度の高いライブラリです。
matplotlib同様、pip install numpyとすることでインストールすることが可能です。

 numpyでcsvを読み込んで三次元散布図を表示させるソースコードはこんな感じです。

import matplotlib.pyplot as mplot
import numpy as np

targetData=np.loadtxt('matplotData/data.csv',skiprows=1,delimiter=',')
print(targetData.shape)
x=[]
y=[]
z=[]

for xyz in targetData:
    x.append(xyz[0])
    y.append(xyz[1])
    z.append(xyz[2])

print(x)
print(y)
print(z)
fig=mplot.figure()
ax=fig.add_subplot(projection='3d')
ax.scatter(x,y,z)
mplot.show()

もちろんこのソースコードをコピーするだけではエラーになります。
準備が必要なので段階を追って説明します。

csvファイルを読み込んで3次元散布図でプロットする手順
  • csvファイルを作る。
  • 作ったcsvファイルを指定した(新規作成)フォルダに格納する。
  • ソースコードをコピーして実行する。

それでは順に解説していきます。

csvファイルを作る。

 今回は、x,y,zのそれぞれの座標が入っているcsvファイルを作ります。
csvファイルとは、カンマ(,)区切りのテキストファイルのことです。

 データ量も.xlsxなどのエクセル独自フォーマットよりも軽いので、現場でよく使われます。

 まずはエクセルでも互換ソフトでもいいので、こんな感じのシートを作ります。

三次元散布図で図示するデータの表
1行目に説明行を入れたcsvファイルの中身。

 重要なのは、このファイルを保存するときに、拡張子と呼ばれる、最後の.○○○を、.csvにすることです。

 エクセルでシートを作ると、.xlsxなどがデフォルトになっていますが、
かならず.csvに書き換えましょう。名前はdata.csvとしてください。

 ファイル名も重要なので注意が必要です。
このdata.csvという名前は、後ほどpythonでコードを書くときに登場します。
もしお手持ちのデータで試したい場合は、
後ほどpythonでコードを書くときにお伝えするところを変更してください。

 各行にx,y,zの並びで座標の成分を入れています。
先ほどファイル名はご自身の物でも構わないとお伝えしましたが、データの配列は上記の通りにしてください。

 ちなみに手早くテスト用として作るなら、エクセルのRand()関数を使うと簡単にできますのでオススメです。

作ったcsvファイルを指定した(新規作成)フォルダに格納する。

 上記で作ったcsvファイルを、指定したフォルダに格納する必要があります。
その指定先は、ソースコードにも記載していますが、ソースコード(~~~.py)と同じ階層のmatplotDataフォルダ内に格納します。
 matplotDataフォルダはわたしが勝手に名前を付けて作ったフォルダになるので、
あなたも新規で同じ名前でフォルダを作って、そこにdata.csvを格納してください。

 再度確認ですが、ファイル名がdata.csvとなっているか見ておいてください。

ソースコードをコピーして実行する。

 ここまでで下準備が完了です。
先ほどしめしたソースコードをコピーして実行してみましょう。

 すると、このようにグラフが出てくるはずです。
※Rand()関数を使用した場合は完全に一致はしません。

ソースコード通りに三次元散布図を表示
csvファイルの中身を3dplotした状態。

 もちろん、このグラフもグラフをクリックした状態でマウスを動かすとぐりぐり動かせます。
csvファイルの中身を変えるだけでプロットされるものが変わりますので、
是非一度変更して結果が変わることを確認してみてください。

ここまでのやり方が理解できたら、もうあなたもご自分のデータを使って三次元散布図が作れますよね!

プロットとその周りをちょっと装飾してみる。

 ここからはもっと三次元散布図の使い方をマスターするためのお話しです。

 ここまでで最低限プロットできるのは理解できたと思いますが、やるならもっときれいにやってみたいですよね。

 しかもこのままだと、どこがX軸、Y軸、Z軸なのかがわかりません。
さらには各軸の最大・最小値もバラバラで美しくありません。

 というわけで次の3つの装飾を加えていきましょう。
完成形のソースコードは最後にまとめてご紹介しますが、
すべて追加したらこんな感じのグラフになります。

三次元散布図を装飾してみた結果
3Dプロットの装飾を行った状態。

 今回は、違いがわかるように極端に設定しています。
この装飾方法が理解できれば、あなたの思った通りのグラフにすることが可能です。

プロットした三次元散布図の軸名やラベルを追加する方法
  • 各軸にラベルを追加する。
  • プロットの色や形状を変更する。
  • 各軸の目盛りを指定する。

各軸にラベルを追加する。

 マウスで自由にぐるぐる回すと、
どこがどの軸なのかわからなくなりますよね。

 そんなときでも軸にラベルがあればどの軸なのか一発でわかります。
ラベルを追加するのはこんな感じ。↓↓

ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')

 今回は単純に各軸にX,Y,Zと振ることにしました。
xlabelがx軸のラベルになります。
ですから、ax.set_xlabel(‘Y’)なんてことをしてしまうと、
matplotlib上のX軸に”Y”と表示されてわけわからなくなるので注意です。

プロットの色や形状を変更する。

 どうせプロットするなら、色を変えたり形を変えたりしたいこともあるでしょう。
というわけで、今回は色をピンクに変更して、形状は三角にしました。

ax.scatter(x,y,z,c='pink',marker='^')

 scatterの引数に追加すればいいだけなので単純でいいですね。
ちなみにmarkerを今回は三角形にしましたが、三角以外にも
様々な形状でプロットすることができます。

 使えるマーカー一覧はこちら↓(公式ページ)

matplotlib.markers — Matplotlib 3.9.2 documentation

各軸の目盛りを指定する。

 次に目盛りです。意図した目盛りになっていない場合ちょっと困りますよね。
具体的には、スケールが見づらかったり、部分的に拡大して表示したかったり。

 2つ以上のグラフを並べるときに違和感が出ちゃうこともありますよね。
今回は目盛りを指定する方法と、グラフのプロット範囲を指定する方法を説明します。

目盛りを指定する方法

 目盛りを指定するには、set_軸ticks()を使用します。
範囲を0から1までに指定して、0.25刻みで線を表示する方法はこちらです。

ax.set_xticks([0,0.25,0.5,0.75,1])
ax.set_yticks([0,0.25,0.5,0.75,1])
ax.set_zticks([0,0.25,0.5,0.75,1])

 すべて手打ちしているのが時間の無駄と感じた場合は、numpyや、データの中から良い感じに目盛りにする指標を取ってきたほうが良いです。

 先ほどのcsvファイルの中にこの指標を保存しておいて、読み込んで使うというやり方もありますね。

プロット範囲を指定する方法

 プロットの範囲の指定方法です。
ここで指定することで、範囲外のデータはプロットされなくなります。
具体的に使うのは、set_軸lim()です。

 今回は0から2の範囲をプロット範囲として指定します。

ax.set_xlim(0,2)
ax.set_ylim(0,2)
ax.set_zlim(0,2)

 こうすることで、各軸0から2までの範囲でプロットされます。
当然、x軸のみプロットする範囲を広げたり・狭めたりすることも可能です。

すべて装飾完了したソースコード

 それではお待ちかね。すべてを含めたソースコードはこちらです。↓↓

import matplotlib.pyplot as mplot
import numpy as np

targetData=np.loadtxt('matplotData/data.csv',skiprows=1,delimiter=',')
print(targetData.shape)
x=[]
y=[]
z=[]
x2=[]
y2=[]
z2=[]

for xyz in targetData:
    x.append(xyz[0])
    y.append(xyz[1])
    z.append(xyz[2])
    x2.append(xyz[0]+0.2)
    y2.append(xyz[1]+0.3)
    z2.append(xyz[2]+0.4)


print(x)
print(y)
print(z)
fig=mplot.figure()

ax=fig.add_subplot(projection='3d')
ax.scatter(x,y,z,c='pink',marker='^')
ax.scatter(x2,y2,z2,c='blue',marker='o')

ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_xlim(0,2)
ax.set_ylim(0,2)
ax.set_zlim(0,2)
ax.set_xticks([0,0.25,0.5,0.75,1])
ax.set_yticks([0,0.25,0.5,0.75,1])
ax.set_zticks([0,0.25,0.5,0.75,1])
mplot.show()

 お気づきかもしれませんが、今回青のプロットとピンクのプロットで2系統のデータにしています。
2系統だろうが、3系統だろうが、scatterすればいいだけ。というのがよくわかりますね。

 公式のサンプルではfor文で2つの系統のデータをscatterしていましたが、このように2回scatterしても問題ありません。正しく表示できます。

pythonのmatplotlib三次元散布図を作る:まとめ

 今回はmatplotlibで3次元散布図を使う方法のご紹介をしました。
numpyで乱数を作成してグラフを描いているものが多いですが、実際使うときは何かのデータをプロットするだろ…

 ということでより実戦的にcsvファイルを読んでそれをプロットする。
という方法でご紹介しました。

 この方法ですが、結構使いこなすと武器になる気がします。
数値データだけで傾向を発見するのは難しいのはあなたもよくご存知かと思います。

 先人の知恵として散布図が開発されたわけですが、それも2次元での散布図が主流です。

 現在はpythonの便利なライブラリを使うことで、手軽に、そして無料で三次元散布図を作ることができます。
3つのパラメータを使って相関関係を視覚的に表してくれるこのツールは、間違いなく有用だと言えます。ぜひ使いこなしてみてください。

pythonをちょっとやってみたくなりましたか?

最後まで読んでいただいたあなたに特別にこちらをご紹介します。

【pythonの基礎知識を無料で講義してもらえるとしたらどうしますか?】

教材ではなく、講義です。

そう。つまり教えてくれるんです。

書籍やインターネットの知識はなんとなく頭に入ってこないな…

なんて思っているなら試してみる価値はあると思います。

なんといっても【無料】ですからね。

どんな仕組みなのかはこちらに記事にしていますので、

読んでみてください。↓↓↓↓

コメント

タイトルとURLをコピーしました