☆youtube更新中☆
▶Youtubeのチャンネル登録で更新頻度がUPするかも!!

Youtubeで文章にするのが難しい内容について
実際にしゃべって解説しています。
ブログでは紹介していない(しにくい)内容も
じゃんじゃん更新中。

▶Youtubeでhobbyhappyを応援する

【三次元散布図】pythonなら、Excelで作るのがきつい三次元散布図もラクラク!

python-3dplot-matplotlibPython
この記事は約11分で読めます。

今回は3次元散布図についてです。

2次元散布図なんかはエクセルでラクラク作成可能ですよね。

こんな感じ。↓

2次元散布図
2次元散布図

文字通り、2つのパラメータを散布図にしたものですよね。

で、ここからですが、

散布図というのは、2つのパラメータ以外に、

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

なんてときもあると思います。

主に解析やられてる方向けですね。

3次元散布図のメリットは今までの2つのパラメータ以外に、

どこかのパラメータが影響しているのでは….というときに

傾向を発見するときに重要だったりします。

ただ、エクセルではできないんですよね…そんな項目ないので。

ただ、pythonなら一瞬でできてしまうんです….

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

自己紹介

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

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

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

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

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

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

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

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

pythonはライブラリが豊富というのが使用するときのメリットですが、

今回もそのメリットが生きます。

pythonで用意されているmatplotlibというライブラリを使用します。

まだ使ったことないよ。という場合は、

このようにpipしておきましょう。

pip install matplotlib

他のライブラリをインストールしたことがあれば、

なにも難しいことはありませんよね。

このmatplotlibですが、グラフを描くならこれ!

というくらい超有名です。

特に解析をやっている人だとほぼ必須な気がします。

matplotlib以外だと、numpyも結構必須だったりしますね。

以前書いた記事でnumpyについて紹介しているので参考にしてみてください。

試しにmatplotlibで作った3次元プロットの一例を張っておきます。

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

Figure-3dscatter
3次元散布図

ちなみに起動させると、マウスでつかんでぐるぐるグラフを回転させることが可能なので、

こっちから見たら…なんてこともその場で可能です。

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

Figure-3dscatter-1point
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しています。

もちろん先ほどの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ファイルを作る。
  • 作ったcsvファイルを指定した(新規作成)フォルダに格納する。
  • ソースコードをコピーして実行する。

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

csvファイルを作る。

今回は、x,y,zのそれぞれの座標が入っているcsvファイルを作ります。

csvファイルとは、カンマ(,)区切りのテキストファイルのことですね。

データ量もxlsxなんかのエクセル独自フォーマットよりも軽いので、

よく使われますね。

それでは作り方はいたって簡単。

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

名前はdata.csvとしてください。

ファイル名も重要なので注意が必要です。

matplot3d-randSheet
1行目に説明行を入れたcsvファイルの中身。

各行にx,y,zの並びで座標の成分が入っている感じです。

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

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

上記で作ったcsvファイルを、指定したフォルダに格納する必要があります。

その指定先は、ソースコードにも記載していますが、

ソースコード(~~~.py)と同じ階層のmatplotDataフォルダ内に格納します。

matplotDataフォルダはわたしが勝手に名前を付けて作ったフォルダになるので、

あなたも新規で同じ名前でフォルダを作って、そこにdata.csvを格納してください。

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

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

それではいよいよ下準備が終わったので、

実行してみましょう。

すると、こんな感じのグラフが出てくるはずです。

csvファイルの中身を3dplotした状態。

もちろん、このグラフもウィンドウのグラフをマウスでぐりぐり動かせます。

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

ここまでで最低限プロットできるのは理解できたと思いますが、

やるならもっときれいにやってみたいですよね。

しかもこのままだと、どこがX軸、Y軸、Z軸なのかがわかりません。

さらには各軸の最大・最小値もバラバラで美しくありません。

というわけで次の3つの装飾を加えていきましょう。

完成形のソースコードは最後にまとめてご紹介しますが、

すべて追加したらこんな感じのグラフになります。

Figure-3dscatter-val
3Dプロットの装飾を行った状態。
  • 各軸にラベルを追加する。
  • プロットの色や形状を変更する。
  • 各軸の目盛りを指定する。

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

やっぱりマウスで自由にぐるぐる回せるので、

どこがどの軸なのかわからなくなりますよね。

そんなときでも軸にラベルがあればどの軸なのか一発でわかります。

というわけでラベルを追加するのはこんな感じ。↓↓

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

今回は単純に各軸にX,Y,Zと振ることにしました。

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

どうせプロットするなら、色を変えたり形を変えたりしたいこともあるでしょう。

というわけで、今回は色をピンクに変更して、形状は三角にしました。

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

scatterの引数に追加すればいいだけなので単純でいいですね。

ちなみにmarkerを今回は三角形にしましたが、

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

matplotlib.markers — Matplotlib 3.5.3 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やら、データの中から良い感じに目盛りにする指標が

取ってこれればそれを使ったほうが良いですね。

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

プロットの範囲は結構重要だと思うのですが、こちらは、

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の基礎知識を無料で講義してもらえるとしたらどうしますか?】

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

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

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

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

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

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

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

コメント

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