ここには、melt
とAxes3D
を使用する1つのアプローチがあります。
まず、OPによって提供されるサンプルデータを生成する:
# signal to pyplot that we want 3d plots
fig, ax = plt.subplots(1, 1, figsize=(10, 10), subplot_kw={'projection': '3d'})
# convenience wrapper for plotting function
def plot_3d(df):
ax.plot(df.x, df.y.astype(float), df.z) # dims must be floats
# reshape with melt(), then plot
plot_3d(pd.melt(sample4, id_vars='x', var_name='y', value_name='z'))
plot_3d(pd.melt(test5, id_vars='x', var_name='y', value_name='z'))
plot_3d(pd.melt(test6, id_vars='x', var_name='y', value_name='z'))
# label axes
ax.set_xlabel('x', fontsize=20)
ax.set_ylabel('y', fontsize=20)
ax.set_zlabel('z', fontsize=20)
# optional view configurations
ax.elev = 10
ax.axim = 20
UPDATE再:Y今
import pandas as pd
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
sample4_z = [1.09734, 1.25772, 1.4181 , 1.57847, 1.73885, 1.06237,
1.21307, 1.36378, 1.51448, 1.66518, 1.02176, 1.16346,
1.30516, 1.44686, 1.58856, 0.97769, 1.11097, 1.24426,
1.37754, 1.51083, 0.93162, 1.05702, 1.18241, 1.30781,
1.43321]
test5_z = [1.12427, 1.31545, 1.50663, 1.69781, 1.88899, 1.06327,
1.24045, 1.41763, 1.59482, 1.772 , 0.99875, 1.16302,
1.3273 , 1.49158, 1.65585, 0.93276, 1.08509, 1.23742,
1.38975, 1.54208, 0.86668, 1.00792, 1.14916, 1.2904 ,
1.43164]
test6_z = [1.08463, 1.30038, 1.51612, 1.73187, 1.94761, 0.99905,
1.19626, 1.39346, 1.59067, 1.78788, 0.91255, 1.09283,
1.2731 , 1.45337, 1.63365, 0.82706, 0.99181, 1.15656,
1.32131, 1.48605, 0.74381, 0.89429, 1.04477, 1.19525,
1.34572]
def make_df(data):
x = [1.1, 1.11, 1.12, 1.13, 1.14]
y = [20, 40, 60, 80, 100]
z = np.array(data).reshape((len(x),len(y)))
return pd.DataFrame(z, index=x, columns=y).reset_index().rename(columns={'index':'x'})
sample4 = make_df(sample4_z)
test5 = make_df(test5_z)
test6 = make_df(test6_z)
は、1つの3Dグリッド上のすべての3つのデータフレームをプロット-axis as categorical
連続する2つの軸だけでは、通常n 3Dプロッティングサーフェスを呼び出すために必要な(または推奨する)必要はありません(たとえば、this similar discussionを参照)。カテゴリ変数をラベル付きの次元としてエンコードすることは明らかです。
このケースは、4番目の次元を表すサンプルグループレベルによってさらに複雑になります。凡例としてエンコードされたy軸のカテゴリを持つプロットのパネルを検討することをお勧めします。このように:あなたは本当に3Dで物事を維持したい場合はまだ
datasets = ['sample4','test5','test6']
line_types = ['-.','--','-']
fix, axes = plt.subplots(1,3, figsize=(14,5))
for i, data in enumerate([sample4, test5, test6]):
data.set_index('x').plot(style=line_types[i], ax=axes[i], sharey=True,
xticks=data.x, title=datasets[i])
、正しいビューの回転との散布図は、あなたが探している効果が得られます。これはまた、y軸が序数変数ではなくメトリック変数として読み取られるという問題を回避します。
# scatter plot with categorical y-axis
def plot_3d(df, color):
ax.scatter(df.x, df.y, df.z, c=color) # dims must be floats
# reshape with melt(), then plot
plot_3d(pd.melt(sample4, id_vars='x', var_name='y', value_name='z'), 'red')
plot_3d(pd.melt(test5, id_vars='x', var_name='y', value_name='z'), 'blue')
plot_3d(pd.melt(test6, id_vars='x', var_name='y', value_name='z'), 'green')
# label axes
ax.set_xlabel('x', fontsize=20)
ax.set_ylabel('y', fontsize=20)
ax.set_zlabel('z', fontsize=20)
# optional view configurations
ax.elev = 10
ax.azim = 280
注:これは、カテゴリとして1つ以上のディメンションを治療するためのbar3d
クラスを使用することは可能ですが、同じカテゴリ値を持つ複数のポイントへのカスケードアプローチは、あなたがしている何を取得できない場合があります探している。
うわー!どうもありがとう!線をy方向に分離することは可能でしょうか?たとえば、赤い線はy軸に沿って連続しており、y軸の値に応じて線分を分けていきたいと思います。 –
私の更新された回答を参照してください。TL; DR - これは可能ですが、ここではデータへの最善のアプローチではないかもしれません。 –
もう一度、ありがとう! –