bessere ContourLabels für ContourPlot

Aug 30 2020

Wenn ich den ContourPlot verwende, verwende ich lieber ContourLabels als die PlotLegends. Die Beschriftungen werden jedoch häufig sehr nahe am Rahmen angezeigt, sodass es manchmal schwierig ist, sie zu lesen.

Beispiel:

 ContourPlot[
    Sin[x^2 + 2 y],
    {x, 0, 2}, {y, 0, 2},
    Contours -> 5,
    ContourLabels -> True
 ]

Wie Sie sehen können, befinden sich einige Zahlen sehr nahe an den Achsen. Da auf dem Grundstück genügend Platz ist, wo sie stattdessen platziert werden könnten, würde ich es vorziehen, sie etwas weiter vom Rahmen entfernt zu haben.

Gibt es einen Weg, dies zu erreichen? Oder müsste ich diese Etiketten manuell platzieren?

Antworten

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];

Holen Sie sich die Datenpunkte für die Konturen in cp

data = Cases[cp, GraphicsComplex[data_List, __] :> data, Infinity][[1]];

Jedes Mal, wenn Folgendes ausgeführt wird, wird zufällig eine Platzierung für die Beschriftungen ausgewählt (ausgenommen Werte sehr nahe an den Kanten). Wenn sich die Beschriftungen immer noch zu nahe an den Kanten befinden oder sich die Beschriftungen benachbarter Konturen überlappen, können Sie sie erneut ausführen, um eine andere Platzierung zu erhalten.

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

Dieses Platzierungsproblem von Konturetiketten geht mindestens auf Version 9 zurück. Ein Kommentar, den ich 2014 von der WRI erhalten habe:

Das Problem mit ContourLabels besteht bereits und wird derzeit von unseren Entwicklern bearbeitet. Ich verstehe, dass dies eine Unannehmlichkeit ist und die von Ihnen vorgeschlagenen Problemumgehungen auch einige der Tricks sind, die wir Benutzern empfehlen, um zu vermeiden, dass Beschriftungen abgeschnitten werden. Abgesehen von diesen Problemumgehungen können Sie versuchen, den Wert von ContourLabels als Funktionen der Form f [x, y, z] zu verwenden, dh benutzerdefinierte Beschriftungen zu erstellen. Siehe unter Details Abschnitt der Dokumentation:http://reference.wolfram.com/mathematica/ref/ContourLabels.html

Die beiden vorgeschlagenen Problemumgehungen sind:

  1. Erhöhen Sie PlotRangePadding, um Platz um das Diagramm für Beschriftungen an den Rändern zu schaffen, und
  2. Positionieren Sie die Beschriftungen manuell am Rand mit der Option ContourLabels mit Funktionen, wie von der WRI vorgeschlagen