今回は3次元散布図についてです。
2次元散布図なんかはエクセルでラクラク作成可能ですよね。
こんな感じ。↓これはエクセルで描いた2次元散布図です。

文字通り、2つのパラメータを散布図にしたものですよね。
で、ここからですが、
散布図というのは、2つのパラメータ以外に、
「もう一個パラメータを追加したい….」
なんてときもあると思います。
主に解析やられてる方向けですね。
3次元散布図のメリットは今までの2つのパラメータ以外に、
どこかのパラメータが影響しているのでは….というときに
傾向を発見するときに重要だったりします。
ただ、エクセルではできないんですよね…そんな項目ないので。
ただ、「pythonなら一瞬で」できてしまうんです….
そんなこと言われたらやるしかないですよね!!!
Pythonで三次元散布図が書けるようになる。
Youtubeチャンネルにさまざまな動画を上げています。
↓↓↓こちらからYoutubeチャンネルにアクセス!! ↓↓↓
↓↓↓↓これまでのPythonの記事についてはこちら↓↓↓↓
3次元散布図に必要なのはmatplotlib。
pythonはライブラリが豊富というのが使用するときのメリットですが、
今回もそのメリットが生きます。
pythonで用意されているmatplotlibというライブラリを使用します。
まだ使ったことないよ。という場合は、
このようにpipしておきましょう。
pip install matplotlib
他のライブラリをインストールしたことがあれば、
なにも難しいことはありませんよね。
このmatplotlibですが、グラフを描くならこれ!
というくらい超有名です。
特に解析をやっている人だとほぼ必須な気がします。
matplotlib以外だと、numpyも結構必須だったりしますね。
以前書いた記事でnumpyについて紹介しているので参考にしてみてください。
試しにmatplotlibで作った3次元プロットの一例を張っておきます。
これでなんとなくイメージが付くと思います。

ちなみに起動させると、マウスでつかんでぐるぐるグラフを回転させることが可能なので、
こっちから見たら…なんてこともその場で可能です。
matplotlibでとりあえずプロットしてみる。

とりあえずプロットしてみないとよくわからないと思うので、
もっともシンプルな感じでプロットしてみましょう。
こちらのソースコードをコピーして起動させてみてください。
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しています。
もちろん先ほどのmatplotlibのインストールが完了していなければこの行でエラーになります。
fig=mplot.figure()
ax=fig.add_subplot(projection='3d')
ここでは、各種定義をしています。
figという変数にpyplotの図を指定しています。
次にaxに3dの軸を指定しています。
ax.scatter(1,1,1)
mplot.show()
3dで指定したaxに実際にx=1,y=1,z=1の点をプロットして、
最後にshow()をしています。
より実戦に近い形でプロットしてみる。
そもそも1点だけソースコード上に数値を指定してプロットさせることなんて、
現実問題そんなシチュエーションないですよね。
というわけで、csvファイルを読み込んで、そのファイルの中身を3次元プロットしてみます。
csvの読み込みはなんでもできますが、
今回はnumpyを使用します。
早速ソースコードはこんな感じです。
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ファイルを作る。
今回は、x,y,zのそれぞれの座標が入っているcsvファイルを作ります。
csvファイルとは、カンマ(,)区切りのテキストファイルのことですね。
データ量もxlsxなんかのエクセル独自フォーマットよりも軽いので、
よく使われますね。
それでは作り方はいたって簡単。
エクセルでも互換ソフトでもいいので、こんな感じのシートを作ります。
名前はdata.csvとしてください。
ファイル名も重要なので注意が必要です。
このdata.csvという名前は、後ほどpythonでコードを書くときに登場します。
もしお手持ちのデータで試したい場合は、
後ほどpythonでコードを書くときにお伝えするところを変更してください。

各行にx,y,zの並びで座標の成分が入っている感じです。
先ほどファイル名はご自身の物でも構わないとお伝えしましたが、
データの配列は上記の通りにしてください。
ちなみに手早くテスト用として作るなら、
エクセルのRand()関数を使うと簡単にできますのでオススメです。
作ったcsvファイルを指定した(新規作成)フォルダに格納する。
上記で作ったcsvファイルを、指定したフォルダに格納する必要があります。
その指定先は、ソースコードにも記載していますが、
ソースコード(~~~.py)と同じ階層のmatplotDataフォルダ内に格納します。
matplotDataフォルダはわたしが勝手に名前を付けて作ったフォルダになるので、
あなたも新規で同じ名前でフォルダを作って、そこにdata.csvを格納してください。
再度確認ですが、ファイル名がdata.csvとなっていることも見ておいてください。
ソースコードをコピーして実行する。
それではいよいよ下準備が終わったので、
実行してみましょう。
すると、こんな感じのグラフが出てくるはずです。

もちろん、このグラフもウィンドウのグラフをマウスでぐりぐり動かせます。
プロットとその周りをちょっと装飾してみる。
ここまでで最低限プロットできるのは理解できたと思いますが、
やるならもっときれいにやってみたいですよね。
しかもこのままだと、どこがX軸、Y軸、Z軸なのかがわかりません。
さらには各軸の最大・最小値もバラバラで美しくありません。
というわけで次の3つの装飾を加えていきましょう。
完成形のソースコードは最後にまとめてご紹介しますが、
すべて追加したらこんな感じのグラフになります。

各軸にラベルを追加する。
やっぱりマウスで自由にぐるぐる回せるので、
どこがどの軸なのかわからなくなりますよね。
そんなときでも軸にラベルがあればどの軸なのか一発でわかります。
というわけでラベルを追加するのはこんな感じ。↓↓
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
今回は単純に各軸にX,Y,Zと振ることにしました。
ax.set_xlabel(‘Y’)
なんてことをしてしまうと、X軸にYと表示されてわけわからなくなるので注意です。
プロットの色や形状を変更する。
どうせプロットするなら、色を変えたり形を変えたりしたいこともあるでしょう。
というわけで、今回は色をピンクに変更して、形状は三角にしました。
ax.scatter(x,y,z,c='pink',marker='^')
scatterの引数に追加すればいいだけなので単純でいいですね。
ちなみにmarkerを今回は三角形にしましたが、
使えるマーカー一覧はこちら↓(公式ページ)
各軸の目盛りを指定する。
目盛りですが、意図した目盛りになっていない場合ちょっと困りますよね。
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やら、データの中から良い感じに目盛りにする指標が
取ってこれればそれを使ったほうが良いですね。
プロット範囲を指定する方法
プロットの範囲は結構重要だと思うのですが、こちらは、
set_軸lim()を使ってしていします。
今回は0から2をプロット範囲として指定します。
ax.set_xlim(0,2)
ax.set_ylim(0,2)
ax.set_zlim(0,2)
こうすることで、各軸0から2までの範囲でプロットされます。
すべて装飾完了したソースコード
それではお待ちかね。すべてを含めたソースコードはこちらです。↓↓
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ファイルを読んでそれをプロットする。
という方法でご紹介しました。
これ結構使いこなすと武器になる気がしますね….
箱ひげ図なんかも使い勝手がいいのでそちらもそのうちご紹介しますね。
pythonをちょっとやってみたくなりましたか?
最後まで読んでいただいたあなたに特別にこちらをご紹介します。
【pythonの基礎知識を無料で講義してもらえるとしたらどうしますか?】
教材ではなく、講義です。
そう。つまり教えてくれるんです。
書籍やインターネットの知識はなんとなく頭に入ってこないな…
なんて思っているなら試してみる価値はあると思います。
なんといっても【無料】ですからね。
どんな仕組みなのかはこちらに記事にしていますので、
読んでみてください。↓↓↓↓
最後まで記事をご覧いただきありがとうございます。
この記事を読んで
と少しでも思っていただけたら幸いです。
最後になりますが、お願いです。
著者のモチベーションアップに、お布施の協力をお願いします。
いただいたお布施は有効活用し、将来の記事作成に役立たせることをお約束します。
コメント