研究でPandasのDataFrameを3次元プロットしたくなりました。
例えば、次のようなデータがあったとしましょう。
このデータを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)
さて本題ですが、僕はこのデータを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)