¿Cómo centrar las barras de histograma alrededor de las marcas de garrapatas usando el despliegue marino? Barras de apilamiento es esencial

He buscado muchas maneras de hacer histogramas centrados alrededor de marcas de garrapatas pero no capaz de encontrar una solución que funciona con el despliegue marino. La función displot me permite apilar el histograma de acuerdo a una columna en el marco de datos y por lo tanto preferiría una solución usando displot o algo que permite apilar basado en una columna en un marco de datos con codificación de color como con paleta.

Incluso después de establecer los valores de garrapata, no soy capaz de hacer que las barras se centren alrededor de las marcas de garrapatas.

Código de ejemplo

# Center the histogram on the tick marks 
tips = sns.load_dataset('tips')
sns.displot(x="total_bill",
                hue="day", multiple = 'stack', data=tips)
plt.xticks(np.arange(0, 50, 5))


También me gustaría trazar un histograma de una variable que toma un único valor y elegir el ancho de bin del histograma resultante de tal manera que se centra alrededor del valor. (0.5 en este ejemplo.)

Puedo conseguir el punto central eligiendo el número de cubos iguales a una serie de marcas de garrapata, pero la barra resultante es muy delgada. ¿Cómo puedo aumentar el tamaño de la barra en este caso, donde sólo hay una barra pero quiero mostrar todos los otros puntos posibles. Al mostrar todas las marcas, el ancho de la barra es muy pequeño. Quiero el mismo centro de la barra en la marca de 0,5 garrapatas pero hacerlo más ancho ya que es el único valor para el que se muestran los recuentos. ¿Alguna solución?

tips['single'] = 0.5
sns.displot(x='single',
                hue="day", multiple = 'stack', data=tips, bins = 10)
plt.xticks(np.arange(0, 1, 0.1))

Editar: ¿Sería posible tener más control sobre las marcas de garrapatas en el segundo caso? No quiero mostrar la ronda a 1 lugar decimal pero elegí cuál de las marcas de garrapatas para mostrar. ¿Es posible mostrar sólo un valor en la marca de garrapatas y tenerlo centrado alrededor de eso?

¿El min_val y max_val en este caso se refieren al valor de la variable que será 0 en este caso y luego el eje x sería trazado en valores negativos incluso cuando no hay ninguno y no quiere mostrarlos.

Pregunta hecha hace 3 años, 4 meses, 28 días - Por daniel1


3 Respuestas:

  • Para su primer problema, es posible que desee averiguar algunas propiedades de los datos que su trama. Por ejemplo, el rango de los datos. Además, es posible que desee elegir de antemano el número de contenedores que desea mostrar.

    tips = sns.load_dataset('tips')
    min_val = tips.total_bill.min()
    max_val = tips.total_bill.max()
    val_width = max_val - min_val
    n_bins = 10
    bin_width = val_width/n_bins
    
    sns.histplot(x="total_bill",
                    hue="day", multiple = 'stack', data=tips,
                    bins=n_bins, binrange=(min_val, max_val),
                    palette='Paired')
    plt.xlim(0, 55) # Define x-axis limits
    

    Otra cosa a recordar es que la anchura de un bar en un histograma identifica los límites de su rango. Así que una barra que abarca [2,5] en el eje x implica que los valores representados por esa barra pertenecen a esa gama.

    Considerando esto, es fácil formular una solución. Supongamos que queremos los gráficos originales de la barra - identificando los límites de cada gráfica de la barra, una solución puede parecer

    plt.xticks(np.arange(min_val-bin_width, max_val+bin_width, bin_width))
    

    Bounded bars

    Ahora, si contrarrestamos las garrapatas por medio ancho de bin, llegaremos a los centros de las barras.

    plt.xticks(np.arange(min_val-bin_width/2, max_val+bin_width/2, bin_width))
    

    Centered Ticks - Paired

    Para su parcela de valor único, la idea sigue siendo la misma. Controla el bin_width y el rango de eje x y las garrapatas. Bin-width tiene que ser controlado explícitamente ya que la inferencia automática de bin-width probablemente será 1 unidad de ancho que en la parcela no tendrá espesor. Las barras de histograma siempre indican un rango - aunque sólo tengamos un solo valor. Esto se ilustra en el siguiente ejemplo y figura.

    single_val = 23.5
    tips['single'] = single_val
    bin_width = 4
    
    fig, axs = plt.subplots(1, 2, sharey=True, figsize=(12,4)) # Get 2 subplots 
    
    # Case 1 - With the single value as x-tick label on subplot 0
    sns.histplot(x='single',
                    hue="day", multiple = 'stack', data=tips, 
                    binwidth=bin_width, binrange=(single_val-bin_width, single_val+bin_width),
                    palette='rocket',
                    ax=axs[0])
    ticks = [single_val, single_val+bin_width] # 2 ticks - given value and given_value + width
    axs[0].set(
        title='Given value as tick-label starts the bin on x-axis',
        xticks=ticks,
        xlim=(0, int(single_val*2)+bin_width)) # x-range such that bar is at middle of x-axis
    axs[0].xaxis.set_major_formatter(FormatStrFormatter('%.1f'))
    
    # Case 2 - With centering on the bin starting at single-value on subplot 1
    sns.histplot(x='single',
                    hue="day", multiple = 'stack', data=tips, 
                    binwidth=bin_width, binrange=(single_val-bin_width, single_val+bin_width),
                    palette='rocket',
                    ax=axs[1])
    
    ticks = [single_val+bin_width/2] # Just the bin center
    axs[1].set(
        title='Bin centre is offset from single_value by bin_width/2',
        xticks=ticks,
        xlim=(0, int(single_val*2)+bin_width) ) # x-range such that bar is at middle of x-axis
    axs[1].xaxis.set_major_formatter(FormatStrFormatter('%.1f'))
    

    Producto:

    Single-value chart

    Siento de tu descripción que lo que realmente estás implicando por un gráfico de barras es un categórica Bar graph. El centro es entonces automático. Porque el bar ya no es un rango sino una categoría discreta. Para la naturaleza numérica y continua de la variable en los datos de ejemplo, no recomendaría tal enfoque. Pandas proporciona para trazar parcelas de barras categóricas. See Aquí.. Por ejemplo, una manera de hacer esto es la siguiente:

    n_colors = len(tips['day'].unique()) # Get number of uniques categories
    agg_df = tips[['single', 'day']].groupby(['day']).agg(
        val_count=('single', 'count'),
        val=('single','max')
    ).reset_index() # Get aggregated information along the categories
    agg_df.pivot(columns='day', values='val_count', index='val').plot.bar(
        stacked=True,
        color=sns.color_palette("Paired", n_colors), # Choose "number of days" colors from palette
        width=0.05 # Set bar width
        ) 
    plt.show()
    

    Esto produce:

    pandas categorical plot

    Respondida el Dec 18, 2020 a las 05:06 - por nodenomad

    Votos positivos: 0 | Votos negativos: 0

  • Para centrar las barras de histograma alrededor de las marcas de garrapatas utilizando seaborn y displot, puedes hacer uso de los parámetros shrink y kde dentro de la función displot. El parámetro shrink se puede ajustar para controlar el ancho de las barras del histograma, mientras que kde se puede establecer en True para suavizar la distribución.

    Aquí te muestro cómo podrías modificar tu código de ejemplo para centrar las barras de histograma alrededor de las marcas de garrapatas:

    python
    import seaborn as sns
    import matplotlib.pyplot as plt
    
    

    Center the histogram on the tick marks

    tips = sns.load_dataset('tips') sns.displot(x="total_bill", hue="day", multiple='stack', data=tips, shrink=0.8, kde=True) plt.xticks(np.arange(0, 50, 5)) plt.show()

    En cuanto al segundo caso, donde solo tienes un valor para la variable y quieres que el histograma esté centrado en ese valor y tenga un ancho mayor, puedes ajustar el parámetro shrink para controlar el ancho de la barra del histograma:

    python
    tips['single'] = 0.5
    sns.displot(x='single', hue="day", multiple='stack', data=tips, bins=10, shrink=0.5, kde=True)
    plt.xticks(np.arange(0, 1, 0.1))
    plt.show()
    

    Para tener más control sobre las marcas de garrapatas, puedes utilizar la función plt.xticks con el parámetro labels para especificar las marcas de garrapatas que deseas mostrar. Por ejemplo:

    python
    tips['single'] = 0.5
    sns.displot(x='single', hue="day", multiple='stack', data=tips, bins=10, shrink=0.5, kde=True)
    plt.xticks(np.arange(0, 1, 0.1), labels=['0.1', '0.2', '0.3', '0.4', '0.5', '0.6', '0.7', '0.8', '0.9'])
    plt.show()
    

    De esta manera, puedes indicar explícitamente las marcas de garrapatas que se mostrarán en el eje x y centrar el histograma alrededor de un valor específico.

    Respondida el Dec 19, 2020 a las 05:01 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Centrado de barras de histograma alrededor de marcas de garrapatas con Seaborn

    Para centrar las barras del histograma alrededor de las marcas de garrapatas utilizando Seaborn, puedes usar la función offset. Esta función desplaza el centro de las barras por una cantidad específica, lo que permite alinearlas con las marcas de garrapatas.

    python
    

    Centrar barras de histograma

    tips = sns.load_dataset('tips') sns.displot(x="total_bill", hue="day", multiple='stack', data=tips, offset=0.5) plt.xticks(np.arange(0, 50, 5))

    Histograma de una variable que toma un único valor

    Para crear un histograma de una variable que solo toma un único valor, debes configurar manualmente el rango del eje x y establecer el ancho del contenedor. Puedes usar plt.xlim() para establecer el rango y plt.hist() para crear el histograma.

    python
    

    Histograma de una variable con un solo valor

    tips['single'] = 0.5 plt.xlim(0, 1) plt.hist(tips['single'], bins=1) plt.xticks([0.5])

    Control de marcas de garrapatas

    Para controlar las marcas de garrapatas, puedes usar la función plt.xticks(). Esta función te permite especificar las ubicaciones de las marcas de garrapatas y las etiquetas correspondientes.

    python
    

    Control de marcas de garrapatas

    plt.xticks([0.5], labels=['0.5'])

    Minval y maxval

    Los parámetros min_val y max_val en plt.xlim() especifican los valores mínimo y máximo del eje x. En tu caso, ya que la variable single solo toma el valor 0.5, puedes establecer min_val y max_val en 0 y 1, respectivamente.

    python
    

    Establecer min_val y max_val

    plt.xlim(0, 1)

    Código completo

    Combinando todos los elementos anteriores, aquí tienes el código completo para crear un histograma de una variable que toma un único valor, centrarlo alrededor de la marca de garrapata 0,5 y controlar las marcas de garrapatas:

    python
    tips['single'] = 0.5
    
    

    Establecer min_val y max_val

    plt.xlim(0, 1)

    Crear histograma

    plt.hist(tips['single'], bins=1)

    Controlar marcas de garrapatas

    plt.xticks([0.5], labels=['0.5'])

    Respondida el Dec 19, 2020 a las 05:10 - por Gemini

    Votos positivos: 0 | Votos negativos: 0