Leyenda de la gráfica de contorno - Matplotlib

1

Como dice la pregunta, tengo un gráfico de contorno y me gustaría mostrar una leyenda para si.

Estoy usando el estilo de trazado de contorno que usa:

dashed lines for negative levels

solid lines for positive values

Me gustaría tener una leyenda para ellos (punteado == negativo y sólido == positivo).

Probé los enfoques que se encuentran aquí y aquí . Sin embargo, como se puede ver a continuación, esto no muestra el resultado correcto.

# Draw the scalar field level curves
div_field = plt.contour(x, y, div_scalar_field, colors='white')
rot_field = plt.contour(x, y, rot_scalar_field, colors='lightgoldenrodyellow')
labels = ['Div Neg', 'Div Pos', 'Rot Neg', 'Rot Pos']
div_field.collections[0].set_label(labels[0])
div_field.collections[-1].set_label(labels[1])
rot_field.collections[0].set_label(labels[2])
rot_field.collections[-1].set_label(labels[3])

ingrese la descripción de la imagen aquí

Como para el campo escalar div , solo tengo niveles positivos, obtuve dos etiquetas con el mismo estilo de línea.

Me pregunto cómo podría lograr lo que quiero correctamente.

Gracias de antemano.

2

Podría resolver esto configurando manualmente la leyenda (que no sé si es el mejor enfoque):

div_neg = plt.Line2D((0, 1), (0, 0), color='white', linestyle='--', linewidth=2)
div_pos = plt.Line2D((0, 1), (0, 0), color='white', linestyle='-', linewidth=2)
rot_neg = plt.Line2D((0, 1), (0, 0), color='lightgoldenrodyellow', linestyle='--', linewidth=2)
rot_pos = plt.Line2D((0, 1), (0, 0), color='lightgoldenrodyellow', linestyle='-', linewidth=2)

plt.legend([rot_max, div_neg, div_pos, rot_neg, rot_pos],
           ['Rot Max Points', 'Div Neg', 'Div Pos', 'Rot Neg', 'Rot Pos'])

ingrese la descripción de la imagen aquí

0

Algo como lo siguiente funciona para mí: este truco completo es usar un punto ficticio etiquetado, buscar su color, aplicarlo a los contornos y luego simplemente trazar la leyenda de la manera habitual:

    import matplotlib as plt

    labels = ['div_field'] # etc.

    dummy_position = [-1.0e3,-1.0e3] # Could automate

    colors = []
    for k in labels:

        # Fetch colours via a dummy point
        dummy_point = plt.plot(dummy_position[0],dummy_position[1], label = k)
        c = dummy_point[-1].get_color()
        colors.append(c)

        # This is specific to your problem, but roughly:
        div_field = plt.contour(x, y, div_scalar_field, colors=c)
        # etc.

    _=plt.legend()

    plt.savefig('contours.pdf')

Espero que tenga sentido.