2 votes

Comment définir correctement les étiquettes dans les sous-plans de contourf ?

J'essaie de me débarrasser de ces points violets sur l'image ci-dessous. Voici mon code :

p_values = [0., 0.05, 0.25, 0.5, 1, 1.5, 2, 5, 10, np.inf]
xx, yy = np.meshgrid(np.linspace(-3, 3, num = 101),
                     np.linspace(-3, 3, num = 101))

fig, axes = plt.subplots(ncols = (len(p_values) + 1) // 2,
                         nrows = 2, figsize = (16, 7))

for p, ax in zip(p_values, axes.flat):
    ### BEGIN Solution (do not delete this comment)
    z = np.linalg.norm([xx, yy], ord = p, axis = 0) 
    ax.contourf(yy, xx, z, 25, cmap = 'coolwarm')
    ax.contour(yy, xx, z, [1], colors = 'fuchsia', linewidths = 3)
    ax.set_title(f'p = {p}')
    ax.legend([f'$x: |x|_{{{p}}} = 1$']);
    ### END Solution (do not delete this comment)
plt.show()

Quels paramètres doivent être spécifiés dans ax.legend() pour que le graphique soit clair.

0voto

JohanC Points 38863

Vous pouvez créer la légende en utilisant un handle explicite. Dans ce cas, la ligne de couleur fuchsia est stockée en tant que dernier élément du fichier ax.collections . La création de la légende avec seulement des étiquettes, alors qu'il n'y avait pas de "poignées avec étiquettes" définies, pourrait être la cause des points violets bizarres.

import matplotlib.pyplot as plt
import numpy as np

p_values = [0., 0.05, 0.25, 0.5, 1, 1.5, 2, 5, 10, np.inf]
xx, yy = np.meshgrid(np.linspace(-3, 3, num=101),
                     np.linspace(-3, 3, num=101))

fig, axes = plt.subplots(ncols=(len(p_values) + 1) // 2,
                         nrows=2, figsize=(16, 7))
cmap = plt.get_cmap('magma').copy()
cmap.set_extremes(over='green', under='black', bad='turquoise')
for p, ax in zip(p_values, axes.flat):
    ### BEGIN Solution (do not delete this comment)
    z = np.linalg.norm([xx, yy], ord=p, axis=0)
    cnt = ax.contourf(yy, xx, z, 25, cmap='coolwarm')
    ax.contour(yy, xx, z, [1], colors='fuchsia', linewidths=3)
    ax.set_title(f'p = {p}')
    ax.legend(handles=[ax.collections[-1]], labels=[f'$x: |x|_{{{p}}} = 1$'])
    plt.colorbar(cnt, ax=ax)
    ### END Solution (do not delete this comment)
plt.tight_layout()
plt.show()

showing contour line in legend

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X