ContourPlot için daha iyi ContourLabels

Aug 30 2020

ContourPlot kullandığımda PlotLegends yerine ContourLabels kullanmayı tercih ediyorum. Bununla birlikte, etiketler genellikle çerçeveye çok yakın görüntülendiğinden, bazen onları okumak zor olabilir.

Misal:

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

Gördüğünüz gibi bazı sayılar eksenlere çok yakın yerleştirilmiş. Arsa içinde yerleştirilebilecekleri yeterli alan olduğundan, bunun yerine çerçeveden biraz daha uzakta olmasını tercih ederim.

Bunu başarmanın bir yolu var mı? Yoksa bu etiketleri manuel olarak mı yerleştirmem gerekir?

Yanıtlar

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

Konturlar için kullanılan veri noktalarını alın cp

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

Aşağıdaki her yürütüldüğünde, etiketler için rastgele bir yerleşim seçecektir (kenarlara çok yakın değerler hariç). Etiketler hala kenarlara çok yakınsa veya bitişik konturlar için olanlar örtüşüyorsa, farklı bir yerleşim elde etmek için tekrar çalıştırabilirsiniz.

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

Kontur etiketlerinin bu yerleştirme sorunu en azından sürüm 9'a kadar uzanıyor. 2014'te WRI'dan aldığım bir yorum:

ContourLabels ile ilgili sorun mevcut bir sorundur ve şu anda geliştiricilerimiz tarafından üzerinde çalışılmaktadır. Bunun bir rahatsızlık olduğunu ve önerdiğiniz geçici çözümlerin, etiketlerin kesilmesini önlemek için kullanıcılara önerdiğimiz püf noktalarından bazıları olduğunu anlıyorum. Bu geçici çözümlerin dışında, ContourLabels değerinin f [x, y, z] formunun işlevleri, yani özel etiketler oluşturmasını deneyebilirsiniz. Belgelerin Ayrıntılar bölümüne bakın:http://reference.wolfram.com/mathematica/ref/ContourLabels.html

Önerilen iki geçici çözüm şunlardır:

  1. PlotRangePadding değerini artırın, kenarlardaki etiketler için çizimin etrafında boşluk bırakın ve
  2. WRI'nin önerdiği gibi işlevlerle ContourLabels seçeneğini kullanarak etiketleri kenarda manuel olarak konumlandırın