meilleurs ContourLabels pour ContourPlot
Lorsque j'utilise ContourPlot, je préfère utiliser ContourLabels plutôt que PlotLegends. Cependant, les étiquettes sont souvent affichées très près du cadre, il peut donc parfois être difficile de les lire.
Exemple:
ContourPlot[
Sin[x^2 + 2 y],
{x, 0, 2}, {y, 0, 2},
Contours -> 5,
ContourLabels -> True
]
Comme vous pouvez le voir, certains nombres sont placés très près des axes. Puisqu'il y a assez d'espace dans l'intrigue où ils pourraient être placés à la place, je préférerais les avoir un peu plus loin du cadre.
Y a-t-il un moyen d'y parvenir? Ou aurais-je besoin de placer ces étiquettes manuellement?
Réponses
Clear["Global`*"]
f[x_, y_] = Sin[x^2 + 2 y];
cp = ContourPlot[
f[x, y], {x, 0, 2}, {y, 0, 2}, Contours -> 5];
Obtenez les points de données utilisés pour les contours dans cp
data = Cases[cp, GraphicsComplex[data_List, __] :> data, Infinity][[1]];
Chaque fois que ce qui suit est exécuté, il choisit au hasard un emplacement pour les étiquettes (à l'exclusion des valeurs très proches des bords). Si les étiquettes sont encore trop proches des arêtes ou si celles des contours adjacents se chevauchent, vous pouvez exécuter à nouveau pour obtenir un placement différent.
Show[cp,
Epilog ->
{Text[Style[Round[f @@ #, 0.01] /. (0.) :> 0,
12, Bold], #] & /@
data[[Cases[cp, Line[pts__] :> RandomChoice[pts[[5 ;; -5]]], Infinity]]]}]
Ce problème de placement des étiquettes de contour remonte au moins à la version 9. Un commentaire que j'ai reçu du WRI en 2014:
Le problème avec ContourLabels est un problème existant, il est actuellement en cours d'élaboration par nos développeurs. Je comprends que c'est un inconvénient et les solutions de contournement que vous avez suggérées sont également quelques-unes des astuces que nous suggérons aux utilisateurs de faire pour éviter que les étiquettes ne soient tronquées. En dehors de ces solutions de contournement, vous pouvez essayer la valeur de ContourLabels pour être des fonctions de la forme f [x, y, z], c'est-à-dire créer des étiquettes personnalisées. Voir sous la section Détails de la documentation:http://reference.wolfram.com/mathematica/ref/ContourLabels.html
Les deux solutions de contournement suggérées sont
- augmentez PlotRangePadding, pour donner de l'espace autour du tracé pour les étiquettes sur les bords, et
- positionner manuellement les étiquettes sur le bord en utilisant l'option ContourLabels avec des fonctions, comme suggéré par WRI