2015-10-29 13 views
6

私は、パンダのデータフレームに格納された一連のデータを持っています。私はseabornのpointplot()を使用して、連結点を持つ複数系列散布図を作成しようとしています。各シリーズは異なる(x、y)値を持ち、データフレームにフロートとして格納されます。各行にはラベルがあり、各系列を区別します。私はPython 2.7、seabornバージョン0.5.1、matplotlibバージョン1.4.3を使用しています。私は見つけることができたseabornを使用して接続点を持つ複数のシリーズ散布図を作成するにはどうすればよいですか?

すべてが、私は次のようでこれを達成することができることを私に語った:

import matplotlib.pyplot as plt 
import seaborn as sns 

# Suppose my dataframe is called 'df', with columns 'x', 'y', and 'label'. 
sns.pointplot(x = 'x', y = 'y', hue = 'label', data = df) 

しかし、これはいくつかの奇妙な行動につながる:

  • 色が正しく識別され、唯一一部のが接続されています
  • x軸の数字が重なり、各データポイントがその値ではなくその値でラベル付けされているように見えます適切なクリーンな値でスケールします(xデータを浮動小数点ではなく文字列/ラベルとして扱うようです)。

私はデータフレームを分割して回避しようとしました。

この場合
df1 = df[df.test_type.values == "label 1"] 
df2 = df[df.test_type.values == "label 2"] 

ax = sns.pointplot(x = 'x',y='y', color = "blue", data = df1) 
sns.pointplot(x = 'x', y = 'y', data = df2, color="red", ax = ax) 

は、すべてのポイントが接続され、それらが適切に着色されている、しかし:私は同時にプロットするのに約10+シリーズを有していてもよく、そして、私は手動でデータを分割しないことを好むと思いますので、これは理想的ではありません再び、x軸は非常に奇妙な動作を示しています。各データフレームからの私のx値が異なっていても、プロットはそれらが同じに見えるようにそれらを整列させます。

は今、私はきれいに私の出力/プロットを投稿するかどうかはわかりませんが、私の問題のいくつかは、次のように再作成することができます。

#import the necessary modules 
import matplotlib.pyplot as plt 
import pandas as pd 
import seaborn as sns 

#Here is some sample data. The 'x2' data is slightly offset from 'x1' 
x1 = range(0,100,10) 
x2 = range(1,100,10) 
x = x1+x2 

#The y-values I generate here mimic the general shape of my actual data 
y1 = x1[::-1] 
y2 = [i+25 for i in x1[::-1]] 
y = y1+y2 

#Two levels of labels that will be applied to the data 
z1 = ["1"]*10 
z2 = ["2"]*10 
z = z1+z2 

#A pandas data frame from the above data 
df = pd.DataFrame({'x': x, 'y': y, 'z': z}) 

#Pointplot using the above data 
sns.pointplot(x = 'x', y = 'y', data = df, hue = 'z') 

次にこのコードの結果を実行:

  • すべてのxの値は全て、で均等にです。 'x2'の値は '1'によって変換された 'x1'と同じであり、各シリーズ内で10の間隔で配置されていることに注意してください。私はこの行動を期待していませんでした。
  • x軸には「きれいな」見た目の縮尺がありません。文字通り、各点の対応するx値にラベルを付けます。ポイントに正しくラベルを付けますが、適切にスケールしません。棒グラフの振る舞いと同様に、x値をラベルとして扱うようです。
  • ポイントは正しく着色されていますが、ポイントは接続されていません。

    はパンダのデータフレームに格納されたデータを使用して接続されているポイントで複数のシリーズの散布図をプロットする簡単/より良い/よりエレガントな方法はあります:

は私の質問を要約すると? Seabornのポイントプロットは理想的でしたが、私が期待していたように機能していないので、私はそれが私が達成する必要のない目的に役立つかもしれないと疑っています。私はこれを達成することができる他のソリューションにオープンしています(できればPythonを使用しています)。

ありがとうございます。自分のコードから出力とプロットをアップロードする方法を知ることができたら私の質問を更新します。

私は100%新しいstackoverflowです。コードで生成されたプロットを投稿して私の質問を明確にしたいのですが、これを理解できませんでした。どのようにこれを行うには、ポインタも非常に私は質問を更新することができます高く評価されるでしょう。

EDIT:それはseabornのpointplotは、私は上記きた奇妙な行動を説明するカテゴリ軸として、x軸を使用していることが判明しました。手動でX軸の動作をカテゴリから数値に変更する方法はありますか?これは最も簡単なアプローチのようですが、私はPythonの細かい調整のプロットにあまり慣れていません。私は同様の問題があったと私は最終的にSeabornのFacetGridを使用して、それを解決し

#Assuming df is a pandas data frame with columns 'x', 'y', and 'label' 
for key,grp in df.groupby('label'): 
    plt.plot(grp.x,grp.y,'o-',label = key) 
plt.legend(loc = 'best') 
+0

あなたのコードは問題ありません。新しいユーザーの場合、画像の埋め込みは無効になっています。 imgur.comにアップロードしてURLを投稿すると、誰かがその質問に編集します。 –

+0

私はあなたが 'plt.plot'を使いたいと思っています – mwaskom

+0

これは向こうに正しい方向だと思いますが、同じシリーズやグループにあるポイントをどのように色付け/接続できるかはわかりません。私はこれを今読み上げようとしていますが、plt.plotの機能を詳細に説明できるソースを見つけることはできません。 –

答えて

4

は、私は私の投稿質問に対する解決策を見つけることができました。ポイントにはplt.scatter、ポイントを結ぶラインにはplt.plotを使用しました。

g = sns.FacetGrid(df, hue="z", size=8) 
g.map(plt.scatter, "x", "y") 
g.map(plt.plot, "x", "y") 

Time series plots

が、これはバージョン0.5.1でSeabornバージョン0.6.0で行われていません。

関連する問題