es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Crear gráficos de distribución de Plotly en Plotly Express.

Estoy tratando de crear una figura similar a un create_distplot de plotly, sin embargo, me gustaría cambiar el estilo de línea a líneas punteadas. Al investigar la función, veo que dicen que la función está en desuso y que debería usar las funciones de plotly.express en su lugar.

**esta función está obsoleta**, usa en su lugar las funciones de :mod:`plotly.express`

Sin embargo, no puedo encontrar nada en los ejemplos de plotly.express que muestre cómo crear algo como el distplot. Todos los ejemplos en el sitio web de plotly todavía utilizan create_distplot. No tengo problema en usar la función obsoleta, excepto que me gustaría ajustar el estilo de línea para que sea una línea punteada, y no veo ninguna forma de cambiar la configuración de la línea, solo los colores. Específicamente, estoy buscando tomar datos de histograma y crear una línea y un rug plot, donde la línea muestre la curva de distribución, como en el ejemplo a continuación. ¿Alguien puede ayudarme a descubrir cómo hacer esto en plotly.express o al menos cómo cambiar el estilo de línea del distplot?

Aquí está la referencia de plotly que estoy utilizando.
https://plotly.com/python/distplot/#basic-distplot

import plotly.figure_factory as ff
import numpy as np

x1 = np.random.randn(200) - 1
x2 = np.random.randn(200)
x3 = np.random.randn(200) + 1

hist_data = [x1, x2, x3]

group_labels = ['Grupo 1', 'Grupo 2', 'Grupo 3']
colors = ['#333F44', '#37AA9C', '#94F3E4']

# Crear distplot con curve_type establecido en 'normal'
fig = ff.create_distplot(hist_data, group_labels, show_hist=False, colors=colors)

# Agregar título
fig.update_layout(title_text='Gráfico de Curva y Rug')
fig.show()

imagen descriptiva

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, parece que no hay forma de cambiar el estilo de línea en la función create_distplot descontinuada de Plotly. Sin embargo, puedes lograr el mismo resultado utilizando el módulo plotly.graph_objects y creando una traza de histograma y una traza de rug por separado, y luego agregar una traza de dispersión para la curva de distribución.

    Aquí tienes un código de ejemplo que logra esto:

    import plotly.graph_objects as go
    import numpy as np
    
    x1 = np.random.randn(200) - 1
    x2 = np.random.randn(200)
    x3 = np.random.randn(200) + 1
    
    data = [x1, x2, x3]
    group_labels = ['Grupo 1', 'Grupo 2', 'Grupo 3']
    colors = ['#333F44', '#37AA9C', '#94F3E4']
    
    fig = go.Figure()
    
    # Agregar trazas de histograma y rug para cada grupo
    for i in range(len(data)):
        fig.add_trace(go.Histogram(x=data[i], histnorm='density', 
                                   marker_color=colors[i], opacity=0.7, 
                                   showlegend=False))
        fig.add_trace(go.Scatter(x=data[i], y=np.zeros(len(data[i])), 
                                 mode='markers', marker=dict(color=colors[i]),
                                 legendgroup=group_labels[i], name=group_labels[i],
                                 showlegend=True, hoverinfo='skip', yaxis='y2'))
    
    # Agregar traza de dispersión para la curva de distribución
    x = np.linspace(-4, 4, 1000)
    y = 1/np.sqrt(2*np.pi) * np.exp(-0.5*x**2)
    fig.add_trace(go.Scatter(x=x, y=y, mode='lines', line=dict(dash='dash'),
                             name='Curva de Distribución'))
    
    # Actualizar diseño
    fig.update_layout(title='Gráfico de Curva y Rug', xaxis_title='Valor',
                      yaxis_title='Densidad', yaxis_range=[0, 0.5], yaxis2_range=[-0.01, 0.01],
                      yaxis2_showgrid=False, yaxis2_zeroline=False)
    fig.show()
    

    En este código, primero definimos los datos, etiquetas de grupo y colores como antes. Luego, creamos el objeto go.Figure y recorremos los datos para agregar una traza de histograma y una traza de rug para cada grupo utilizando las clases go.Histogram y go.Scatter, respectivamente. Ten en cuenta que establecemos showlegend=False para las trazas de histograma para que no aparezcan en la leyenda. Establecemos yaxis='y2' para las trazas de rug para que aparezcan en un eje y separado con rango cero, lo que crea el efecto de rug.

    A continuación, definimos los valores x e y para la curva de distribución y la agregamos como una traza de dispersión utilizando la clase go.Scatter, con mode='lines' y line=dict(dash='dash') para establecer el estilo de línea punteada.

    Finalmente, actualizamos el diseño para establecer los títulos y rangos de los ejes, y ocultar la cuadrícula y la línea cero para el eje y del rug.

    La gráfica de salida debe lucir así:

    output

Comments are closed.