2017-04-25 16 views
0

私の目標は、次のlinkのトップグラフに類似したものをプロットすることです。複数のデータフレーム用のpandas 3Dプロット

私はいくつかのtxtファイルを持っています。それらのファイルはそれぞれ異なるサンプルに対応しています。 (私はnumpyの配列としてロードされていた場合、それが簡単かもしれないのかはわからないが) 現在、私は私のデータは、パンダのデータフレームとしてロードされている:

sample4.head() 
Out[61]: 
      20  40  60  80  100 
x             
1.10 1.09734 1.25772 1.41810 1.57847 1.73885 
1.11 1.06237 1.21307 1.36378 1.51448 1.66518 
1.12 1.02176 1.16346 1.30516 1.44686 1.58856 
1.13 0.97769 1.11097 1.24426 1.37754 1.51083 
1.14 0.93162 1.05702 1.18241 1.30781 1.43321 

test5.head() 
Out[62]: 
      20  40  60  80  100 
x             
1.10 1.12427 1.31545 1.50663 1.69781 1.88899 
1.11 1.06327 1.24045 1.41763 1.59482 1.77200 
1.12 0.99875 1.16302 1.32730 1.49158 1.65585 
1.13 0.93276 1.08509 1.23742 1.38975 1.54208 
1.14 0.86668 1.00792 1.14916 1.29040 1.43164 

test6.head() 
Out[63]: 
      20  40  60  80  100 
x             
1.10 1.08463 1.30038 1.51612 1.73187 1.94761 
1.11 0.99905 1.19626 1.39346 1.59067 1.78788 
1.12 0.91255 1.09283 1.27310 1.45337 1.63365 
1.13 0.82706 0.99181 1.15656 1.32131 1.48605 
1.14 0.74381 0.89429 1.04477 1.19525 1.34572 

それが見られるように、すべてのサンプルは、一つの列を共有します。次のアプローチは、単純な2次元プロット与え、単一のサンプルのために働く:

sample4.plot() 

をしかし、私の考えは、y軸は、個々のサンプルIの各なければならないことを意味し、y軸に沿って、私が持っているすべてのデータフレームをプロットすることです上記の例のような3次元グラフでは、データフレームを「スタック」して3番目の軸を使用してプロットする方法はわかりません。

ご協力いただければ幸いです。

ありがとうございます。

答えて

2

ここには、meltAxes3Dを使用する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 

3d plot

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]) 

panel plots

、正しいビューの回転との散布図は、あなたが探している効果が得られます。これはまた、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 

3d scatter plot

注:これは、カテゴリとして1つ以上のディメンションを治療するためのbar3dクラスを使用することは可能ですが、同じカテゴリ値を持つ複数のポイントへのカスケードアプローチは、あなたがしている何を取得できない場合があります探している。

+0

うわー!どうもありがとう!線をy方向に分離することは可能でしょうか?たとえば、赤い線はy軸に沿って連続しており、y軸の値に応じて線分を分けていきたいと思います。 –

+0

私の更新された回答を参照してください。TL; DR - これは可能ですが、ここではデータへの最善のアプローチではないかもしれません。 –

+0

もう一度、ありがとう! –

関連する問題