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