Combine (superponga) dos diagramas de factores en matplotlib

Combine (superponga) dos diagramas de factores en matplotlib

Necesito agregar swarmplot a boxplot en matplotlib, pero no sé cómo hacerlo con factorplot. Creo que puedo iterar con subparcelas, pero me gustaría aprender a hacerlo con seaborn y factorplot.

Un ejemplo simple (graficando usando el mismo eje ax ):

import seaborn as sns
tips = sns.load_dataset("tips")
ax = sns.boxplot(x="tip", y="day", data=tips, whis=np.inf)
ax = sns.swarmplot(x="tip", y="day", data=tips, color=".2")

El resultado: ingrese la descripción de la imagen aquí

En mi caso, necesito superponer la gráfica del factor de enjambre:

g = sns.factorplot(x="sex", y="total_bill",
                      hue="smoker", col="time",
                      data=tips, kind="swarm",
                      size=4, aspect=.7);

y diagrama de caja

¿No sé cómo usar los ejes (extraído de g)?

Algo como:

g = sns.factorplot(x="sex", y="total_bill",
                          hue="smoker", col="time",
                          data=tips, kind="box",
                          size=4, aspect=.7);

ingrese la descripción de la imagen aquí

Quiero algo como esto, pero con factorplot y boxplot en lugar de violinplot

ingrese la descripción de la imagen aquí

Mostrar la mejor respuesta

Necesitarías 2 diagramas de caja, porque tienes dos diagramas de enjambre, ¿verdad? ¿No tendría más sentido trazar directamente dos diagramas de enjambre y dos diagramas de caja que se pueden superponer fácilmente?

@ImportanceOfBeingErnest, ¡absolutamente! Quiero exactamente lo que sugeriste, pero estoy luchando por hacerlo. ¿Alguna solución fácil?

La edición es confusa. ¿La trama que muestra que desea tener solo tiene una subtrama?

En lugar de tratar de superponer las dos subparcelas de una gráfica de factores con diagramas de caja individuales (lo cual es posible, pero no me gusta), se pueden crear las dos subparcelas individualmente.

Luego, recorrería los grupos y los ejes y trazaría un par de diagramas de caja y de enjambre para cada uno.

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

tips = sns.load_dataset("tips")

fig, axes = plt.subplots(ncols=2, sharex=True, sharey=True)

for ax, (n,grp) in zip(axes, tips.groupby("time")):
    sns.boxplot(x="sex", y="total_bill", data=grp, whis=np.inf, ax=ax)
    sns.swarmplot(x="sex", y="total_bill", hue="smoker", data=grp, 
                  palette=["crimson","indigo"], ax=ax)
    ax.set_title(n)
axes[-1].get_legend().remove()
plt.show()

ingrese la descripción de la imagen aquí

fabuloso! Simplemente lees mi mente. Esto es exactamente lo que necesitaba y luché durante varias horas :( ¡¡¡Muchas gracias!!!