web-dev-qa-db-ja.com

複数の散布図のプロットpandas

以下に示すように、複数のグラフをプロットすることについて多くの質問があると思いますが、この場合には特にありません。

pandasドキュメンテーションは、複数の列グループを単一の軸にプロットするために「プロット方法を繰り返す」と述べています。しかし、3つ以上の列グループに対してこれはどのように機能しますか? :

bx = df.plot(kind='scatter', x='a',y='f',color = 'Green',label ='f')

このbxはどこに渡されますか?

また、プロットが同じグラフである場合、x軸は一貫して「a」または「c」のどちらでもないはずですか?しかし、ドキュメントには2つの異なるx軸があります: 'a'and 'c'

enter image description here

8
Amoroso

このbxはどこに渡されますか?

最初の呼び出しではなく、2番目のplotの呼び出しを繰り返す必要があるため、bxの必要はありません。

詳細:plotは、オプションのax引数に課税します。これは、描画する軸です。引数が提供されない場合、関数は新しいプロットと軸を作成します。さらに、軸は関数によって返されるため、以降の描画操作に再利用できます。アイデアはnotax引数をplotの最初の呼び出しに渡し、返された軸をすべてで使用することですその後の呼び出し。

Plotへの各呼び出しが、渡されたのと同じ軸を返すことを確認できます。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(100, 6), columns=['a', 'b', 'c', 'd', 'e', 'f'])


ax1 = df.plot(kind='scatter', x='a', y='b', color='r')    
ax2 = df.plot(kind='scatter', x='c', y='d', color='g', ax=ax1)    
ax3 = df.plot(kind='scatter', x='e', y='f', color='b', ax=ax1)

print(ax1 == ax2 == ax3)  # True

enter image description here

また、プロットが同じグラフである場合、x軸は一貫して「a」または「c」のどちらでもないはずですか?

必ずしも。同じ軸に異なる列を配置することが理にかなっている場合は、それらが表すデータに依存します。たとえば、aが収入で、cが支出である場合、両方を同じ「お金」軸に置くのが理にかなっています。対照的に、aがエンドウ豆の数で、cが電圧の場合、それらはおそらく同じ軸上にあるべきではありません。

10
kazemakase

任意の列に対して任意の列をプロットできます。それが理にかなっているかどうかは、自分で決める必要があります。例えば。距離を示す列と同じ軸に時間を示す列をプロットすることは意味がありませんが、同じ軸に距離を含む2つの列をプロットすることは問題ありません。

Certinプロットが既存の軸(ax)上にあることを指定するには、ドキュメントにあるようにaxキーワードを指定します。もちろん、同じ軸上に複数のプロットを作成できます。

ax = df.plot(kind="scatter", x="x",y="a", color="b", label="a vs. x")
df.plot(x="x",y="b", color="r", label="b vs. x", ax=ax)
df.plot( x="x",y="c", color="g", label="c vs. x", ax=ax)

完全な例:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0,6.3, 50)
a = (np.sin(x)+1)*3
b = (np.cos(x)+1)*3
c = np.ones_like(x)*3
d = np.exp(x)/100.
df = pd.DataFrame({"x":x, "a":a, "b":b, "c":c, "d":d})

ax = df.plot(kind="scatter", x="x",y="a", color="b", label="a vs. x")
df.plot(x="x",y="b", color="r", label="b vs. x", ax=ax)
df.plot( x="x",y="c", color="g", label="c vs. x", ax=ax)
df.plot( x="d",y="x", color="orange", label="b vs. d", ax=ax)
df.plot( x="a",y="x", color="purple", label="x vs. a", ax=ax)

ax.set_xlabel("horizontal label")
ax.set_ylabel("vertical label")
plt.show()

enter image description here

pyviz verseの中には hvplot というライブラリがあり、非常に素晴らしい高レベルのプロット機能を提供します( holoviews )パンダと一緒にすぐに使える:

import numpy as np
import hvplot.pandas

df = pd.DataFrame(np.random.randn(100, 6), columns=['a', 'b', 'c', 'd', 'e', 'f'])

df.hvplot(x='a', y=['b', 'c', 'd', 'e'], kind='scatter')

enter image description here

0
user2739472