lepsze ContourLabels dla ContourPlot
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
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]]]}]
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
- zwiększyć PlotRangePadding, aby wokół wykresu było miejsce na etykiety na krawędziach, oraz
- ręcznie ustaw etykiety na krawędzi za pomocą opcji ContourLabels z funkcjami, zgodnie z sugestią WRI