lepsze ContourLabels dla ContourPlot

Aug 30 2020

Kiedy używam ContourPlot, wolę używać ContourLabels niż używać PlotLegends. Jednak etykiety są często wyświetlane bardzo blisko ramki, więc czasami może być trudno je odczytać.

Przykład:

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

Jak widać, niektóre liczby są umieszczone bardzo blisko osi. Ponieważ na działce jest wystarczająco dużo miejsca, w którym można je umieścić zamiast tego, wolałbym, aby były one nieco dalej od ramy.

Czy istnieje sposób na osiągnięcie tego? A może musiałbym ręcznie umieścić te etykiety?

Odpowiedzi

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

Pobierz punkty danych używane do konturów w programie cp

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

Za każdym razem, gdy wykonywane jest poniższe polecenie, losowo wybierze położenie etykiet (z wyłączeniem wartości bardzo blisko krawędzi). Jeśli etykiety są nadal zbyt blisko krawędzi lub te dla sąsiednich konturów nakładają się, możesz wykonać ponownie, aby uzyskać inne położenie.

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

Ten problem z umieszczaniem etykiet konturów sięga co najmniej do wersji 9. Komentarz, który otrzymałem od WRI w 2014 roku:

Problem z ContourLabels jest już istniejący, nad którym obecnie pracują nasi programiści. Rozumiem, że jest to niedogodność, a zaproponowane przez Ciebie obejścia to także niektóre ze sztuczek, które sugerujemy użytkownikom, aby uniknąć obcinania etykiet. Poza tymi obejściami można wypróbować wartość ContourLabels jako funkcje w postaci f [x, y, z], czyli tworzyć etykiety niestandardowe. Zobacz sekcję Szczegóły w dokumentacji:http://reference.wolfram.com/mathematica/ref/ContourLabels.html

Dwa sugerowane obejścia to

  1. zwiększyć PlotRangePadding, aby wokół wykresu było miejsce na etykiety na krawędziach, oraz
  2. ręcznie ustaw etykiety na krawędzi za pomocą opcji ContourLabels z funkcjami, zgodnie z sugestią WRI