2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PandasのDataFrameを3Dプロットする

Last updated at Posted at 2020-12-25

研究でPandasのDataFrameを3次元プロットしたくなりました。
例えば、次のようなデータがあったとしましょう。
image.png
このデータをx軸はA、y軸はB、z軸はCの値でプロットするのは非常に簡単でいっぱい記事があり、例えば以下のようなコードで可能です。

import pandas as pd
%matplotlib notebook
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

df = pd.DataFrame({'A':[0,1,2,3,4],
                   'B':[0,1,4,9,16],
                   'C':[0,1,8,27,64]})
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
sc = ax.scatter(df.A, df.B, df.C, s=100)

ダウンロード (4).png
この画像のようにプロットできるでしょう。

さて本題ですが、僕はこのデータをcolumnをx軸に、indexをy軸に、そして各データをz軸に、合計15点の3Dプロットを行いたくなりました。
結論以下のコードでできるのですが少し面倒でした。

import pandas as pd
%matplotlib notebook
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

df = pd.DataFrame({'A':[0,1,2,3,4],
                   'B':[0,1,4,9,16],
                   'C':[0,1,8,27,64]})

#文字だとプロットできないのでcolumn名を数字に変更
df.rename(columns={'A':1, 'B':2, 'C':3}, inplace=True)

X = np.array([])
Y = np.array([])
Z = np.array([])

for i in range(df.index.size):
    X = np.concatenate([X, np.full(df.columns.size, df.index[i])], 0)

for i in range(df.index.size):
    Y = np.concatenate([Y, np.array(df.columns)], 0)

for i in range(df.index.size):
    Z = np.concatenate([Z, np.array(df[i:i+1])[0]], 0)
    
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
sc = ax.scatter(X, Y, Z)

以下の画像のようにできました。
ダウンロード (5).png
お疲れ様でした。
誰かの参考になったらうれしいです。

2
1
1

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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?