Múltiples histogtwigs en pandas

Me gustaría crear el siguiente histogtwig (vea la imagen a continuación) tomado del libro “Think Stats”. Sin embargo, no puedo conseguirlos en la misma ttwig. Cada DataFrame toma su propia subplot.

Tengo el siguiente código:

import nsfg import matplotlib.pyplot as plt df = nsfg.ReadFemPreg() preg = nsfg.ReadFemPreg() live = preg[preg.outcome == 1] first = live[live.birthord == 1] others = live[live.birthord != 1] #fig = plt.figure() #ax1 = fig.add_subplot(111) first.hist(column = 'prglngth', bins = 40, color = 'teal', \ alpha = 0.5) others.hist(column = 'prglngth', bins = 40, color = 'blue', \ alpha = 0.5) plt.show() 

El código anterior no funciona cuando uso ax = ax1 como se sugiere en: pandas múltiples gráficos que no funcionan como hist. Ni este ejemplo hace lo que necesito: sobreponer múltiples histogtwigs usando pandas . Cuando uso el código tal como está, crea dos ventanas con histogtwigs. ¿Alguna idea de cómo combinarlas?

Aquí hay un ejemplo de cómo me gustaría que se vea la figura final: introduzca la descripción de la imagen aquí

Por lo que puedo decir, los pandas no pueden manejar esta situación. Eso está bien ya que todos sus métodos de trazado son solo por conveniencia. Tendrá que usar matplotlib directamente. Así es como lo hago:

 %matplotlib inline import numpy as np import matplotlib.pyplot as plt import pandas #import seaborn #seaborn.set(style='ticks') np.random.seed(0) df = pandas.DataFrame(np.random.normal(size=(37,2)), columns=['A', 'B']) fig, ax = plt.subplots() a_heights, a_bins = np.histogram(df['A']) b_heights, b_bins = np.histogram(df['B'], bins=a_bins) width = (a_bins[1] - a_bins[0])/3 ax.bar(a_bins[:-1], a_heights, width=width, facecolor='cornflowerblue') ax.bar(b_bins[:-1]+width, b_heights, width=width, facecolor='seagreen') #seaborn.despine(ax=ax, offset=10) 

Y eso me da: introduzca la descripción de la imagen aquí

Desde el sitio web de pandas ( http://pandas.pydata.org/pandas-docs/stable/visualization.html#visualization-hist ):

 df4 = pd.DataFrame({'a': np.random.randn(1000) + 1, 'b': np.random.randn(1000), 'c': np.random.randn(1000) - 1}, columns=['a', 'b', 'c']) plt.figure(); df4.plot(kind='hist', alpha=0.5) 

En caso de que alguien quiera trazar un histogtwig sobre otro (en lugar de barras alternas), simplemente puede llamar a .hist() consecutivamente en la serie que desea trazar:

 %matplotlib inline import numpy as np import matplotlib.pyplot as plt import pandas np.random.seed(0) df = pandas.DataFrame(np.random.normal(size=(37,2)), columns=['A', 'B']) df['A'].hist() df['B'].hist() 

Esto te da:

introduzca la descripción de la imagen aquí

Tenga en cuenta que el orden al que llama .hist() importante (el primero será al final)

Aquí está el fragmento, En mi caso, especificé explícitamente los intervalos y el rango, ya que no manejé la eliminación atípica como autor del libro.

 fig, ax = plt.subplots() ax.hist([first.prglngth, others.prglngth], 10, (27, 50), histtype="bar", label=("First", "Other")) ax.set_title("Histogram") ax.legend() 

Consulte Matplotlib multihist plot con diferentes tamaños de ejemplo .

Usted hace dos marcos de datos y un eje matplotlib

 import matplotlib.pyplot as plt import pandas as pd import numpy as np df1 = pd.DataFrame({ 'data1': np.random.randn(10), 'data2': np.random.randn(10) }) df2 = df1.copy() fig, ax = plt.subplots() df1.hist(column=['data1'], ax=ax) df2.hist(column=['data2'], ax=ax)