web-dev-qa-db-fra.com

seaborn produit des figures séparées dans les sous-parcelles

j'essaie de faire une sous-intrigue 2x1 dans seaborn en utilisant:

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

il produit deux figures distinctes au lieu d'une seule figure avec deux sous-parcelles. Pourquoi fait-il cela et comment peut-on appeler plusieurs fois Seaborn pour des sous-parcelles distinctes?

j'ai essayé de regarder le post référencé ci-dessous mais je ne vois pas comment les sous-tracés peuvent être ajoutés même si factorplot est appelé en premier. quelqu'un peut-il en montrer un exemple? Ce serait utile. ma tentative:

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

Le problème est que factorplot crée une nouvelle instance de FacetGrid (qui à son tour crée sa propre figure), sur laquelle il appliquera une fonction de traçage (pointplot par défaut). Donc, si tout ce que vous voulez est le pointplot, il serait logique d'utiliser simplement pointplot, et non factorplot.

Ce qui suit est un peu un hack, si vous vraiment voulez, pour une raison quelconque, dire à factorplot qui Axes pour effectuer son traçage. Comme @mwaskom le fait remarquer dans les commentaires, ce n'est pas un comportement pris en charge, donc bien qu'il puisse fonctionner maintenant, il se peut qu'il ne le soit plus à l'avenir.

Vous pouvez dire à factorplot de tracer sur un Axes donné en utilisant le kwarg ax, qui est transmis à matplotlib, donc la réponse liée fait en quelque sorte répondez à votre question. Cependant, il créera toujours la deuxième figure en raison de l'appel factorplot, mais cette figure sera juste vide. Une solution de contournement ici pour fermer ce chiffre supplémentaire avant d'appeler plt.show()

Par exemple:

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