meilleurs ContourLabels pour ContourPlot

Aug 30 2020

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

2 BobHanlon Aug 30 2020 at 22:36
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]]]}]

1 tad Aug 31 2020 at 00:46

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

  1. augmentez PlotRangePadding, pour donner de l'espace autour du tracé pour les étiquettes sur les bords, et
  2. positionner manuellement les étiquettes sur le bord en utilisant l'option ContourLabels avec des fonctions, comme suggéré par WRI