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.

Cómo cambiar los marcadores predeterminados en scatterplot Python

Estoy intentando agregar marcadores meteorológicos en lugar de círculos básicos en un gráfico de dispersión. Más específicamente, me gustaría mostrar cambios físicos y mentales dependiendo de las condiciones meteorológicas. Para este propósito, me gustaría utilizar algunos iconos meteorológicos (archivos .svg) en lugar de círculos de diferentes colores. Sin embargo, obtengo el siguiente error:

TypeError: tipo no hashable: ‘Path’

Aquí está mi código:

clear_marker = parse_path(“M 350.04,161.95
C 350.04,161.95 391.76,120.24 391.76,120.24M 120.24,391.76
C 120.24,391.76 161.96,350.04 161.96,350.04M 389.00,256.00
C 389.00,256.00 448.00,256.00 448.00,256.00M 64.00,256.00
C 64.00,256.00 123.00,256.00 123.00,256.00M 350.04,350.04
C 350.04,350.04 391.76,391.76 391.76,391.76M 120.24,120.24
C 120.24,120.24 161.96,161.95 161.96,161.95M 256.00,389.00
C 256.00,389.00 256.00,447.99 256.00,447.99M 256.00,64.00
C 256.00,64.00 256.00,123.00 256.00,123.00M 157.56,216.68M 150.90,242.12
C 150.31,246.60 150.00,251.26 150.00,256.00
150.00,256.01 150.00,256.02 150.00,256.02
150.00,314.57 197.46,362.02 256.00,362.02
314.54,362.02 362.00,314.57 362.00,256.02
362.00,197.48 314.54,150.02 256.00,150.02
220.35,150.02 188.80,167.63 169.59,194.62M 276.00,170.00
C 217.46,170.00 170.01,217.46 170.01,276.00
170.01,300.17 178.09,322.45 191.71,340.28
209.54,353.90 231.82,361.99 255.99,361.99
314.53,361.99 361.99,314.53 361.99,255.99
361.99,231.83 353.90,209.55 340.29,191.72
322.52,178.10 300.28,170.00 276.16,170.00
276.11,170.00 276.05,170.00 276.00,170.00
276.00,170.00 276.00,170.00 276.00,170.00 “)
plt.plot(x, y, ‘o’, marker=clear_marker)
(Sólo he probado en el primer marcador para ver si funcionaba)

GRACIAS.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que el objeto Path no es hasheable. Esto se debe probablemente a que los objetos Path son mutables, lo que significa que su estado puede ser cambiado después de haber sido creados. En Python, solo se pueden utilizar objetos inmutables como claves en un diccionario, lo que ocurre en segundo plano cuando se usa un marcador en un gráfico.

    Para solucionar este problema, puedes crear un nuevo marcador usando un objeto Path y luego convertirlo en un objeto PathPatch. Esto lo hará hasheable y por lo tanto utilizable como un marcador en matplotlib. Aquí tienes un ejemplo:

    from matplotlib.path import Path
    from matplotlib.patches import PathPatch
    
    clear_marker_path = Path([
        (350.04, 161.95), (391.76, 120.24),
        (120.24, 391.76), (161.96, 350.04),
        (389, 256), (448, 256),
        (64, 256), (123, 256),
        (350.04, 350.04), (391.76, 391.76),
        (120.24, 120.24), (161.96, 161.95),
        (256, 389), (256, 447.99), 
        (256, 64), (256, 123),
        (157.56, 216.68), (150.90, 242.12),
        (150.31, 246.60), (150.00, 251.26),
        (150.00, 256), (150.00, 256.01),
        (150.00, 256.02), (150.00, 256.02),
        (150.00, 314.57), (197.46, 362.02),
        (256.00, 362.02), (314.54, 362.02),
        (362.00, 314.57), (362.00, 256.02),
        (362.00, 197.48), (314.54, 150.02),
        (256.00, 150.02), (220.35, 150.02),
        (188.80, 167.63), (169.59, 194.62),
        (276.00, 170.00), (217.46, 170.00),
        (170.01, 217.46), (170.01, 276.00),
        (170.01, 300.17), (178.09, 322.45),
        (191.71, 340.28), (209.54, 353.90),
        (231.82, 361.99), (255.99, 361.99),
        (314.53, 361.99), (361.99, 314.53),
        (361.99, 255.99), (361.99, 231.83),
        (353.90, 209.55), (340.29, 191.72),
        (322.52, 178.10), (300.28, 170.00),
        (276.16, 170.00), (276.11, 170.00),
        (276.05, 170.00), (276.00, 170.00)
    ])
    
    clear_marker = PathPatch(clear_marker_path, facecolor='none', edgecolor='blue')
    
    plt.plot(x, y, 'o', markersize=10, marker=clear_marker)
    

    En este ejemplo, hemos creado un nuevo objeto Path para el icono del clima utilizando las coordenadas del método parse_path original. Luego utilizamos el constructor PathPatch para crear un nuevo marcador a partir del path, especificando que el facecolor debería ser none y el edgecolor debería ser azul. Finalmente, utilizamos el nuevo marcador en nuestro gráfico.

    ¡Espero que esto te ayude!

Comments are closed.