web-dev-qa-db-ja.com

seabornは、サブプロットで個別の図を生成します

私はシーボーンで2x1のサブプロット図を作成しようとしています:

data = pandas.DataFrame({"x": [1, 2, 4],
                        "y": [10,20,40],
                        "s": [0.01,0.1,1.0]})

plt.figure()
plt.subplot(2, 1, 1)
sns.pointplot(x="x", y="y", data=data)
plt.errorbar(np.arange(len(data["x"])), data["y"], yerr=data["s"])
plt.subplot(2, 1, 2)
sns.factorplot(x="x", y="y", data=data)
plt.show()

2つのサブプロットを持つ単一の図ではなく、2つの別個の図を生成します。なぜこれを行うのですか?また、別々のサブプロットに対してシーボーンを複数回呼び出すことができますか?

下記の投稿を見てみましたが、factorplotが最初に呼び出された場合でもサブプロットを追加する方法がわかりません。誰かがこの例を示すことができますか?役に立つでしょう。私の試み:

data = pandas.DataFrame({"x": [1, 2, 4],
                        "y": [10,20,40],
                        "s": [0.01,0.1,1.0]})

fig = plt.figure()
sns.pointplot(x="x", y="y", data=data)
ax = sns.factorplot(x="x", y="y", data=data)
fig.add_subplot(212, axes=ax)
plt.errorbar(np.arange(len(data["x"])), data["y"], yerr=data["s"])
plt.show()
11
lgd

問題は、factorplotが新しいFacetGridインスタンスを作成し(それが独自のFigureを作成する)、そこにプロット関数(デフォルトではポイントプロット)が適用されることです。したがって、必要なのがpointplotだけである場合は、pointplotではなく、factorplotだけを使用するのが理にかなっています。

以下は、何らかの理由でreallyが、どのfactorplotでプロットを実行するかをAxesに伝えたい場合のちょっとしたハックです。 @mwaskomがコメントで指摘しているように、これはサポートされている動作ではないため、現在は動作するかもしれませんが、将来は動作しない可能性があります。

factorplotに渡されるAxes kwargを使用して、特定のaxでプロットするようにmatplotlibに指示することができます。そのため、リンクされた回答がクエリに回答します。ただし、factorplot呼び出しのために2番目の図が作成されますが、その図は空になります。ここでの回避策は、plt.show()を呼び出す前に余分な図を閉じることです。

例えば:

import matplotlib.pyplot as plt
import pandas
import seaborn as sns
import numpy as np

data = pandas.DataFrame({"x": [1, 2, 4],
                        "y": [10,20,40],
                        "s": [10,10,10]}) # I increased your errors so I could see them

# Create a figure instance, and the two subplots
fig = plt.figure()
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212)

# Tell pointplot to plot on ax1 with the ax argument
sns.pointplot(x="x", y="y", data=data, ax=ax1)

# Plot the errorbar directly on ax1
ax1.errorbar(np.arange(len(data["x"])), data["y"], yerr=data["s"])

# Tell the factorplot to plot on ax2 with the ax argument
# Also store the FacetGrid in 'g'
g=sns.factorplot(x="x", y="y", data=data, ax=ax2)

# Close the FacetGrid figure which we don't need (g.fig)
plt.close(g.fig)

plt.show()

enter image description here

15
tmdavison