ContourPlot을위한 더 나은 ContourLabels

Aug 30 2020

ContourPlot을 사용할 때 PlotLegends를 사용하는 것보다 ContourLabels를 사용하는 것을 선호합니다. 그러나 레이블은 종종 프레임에 매우 가깝게 표시되므로 때때로 읽기가 어려울 수 있습니다.

예:

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

보시다시피 일부 숫자는 축에 매우 가깝게 배치됩니다. 대신 배치 할 수있는 플롯에 충분한 공간이 있으므로 프레임에서 조금 더 멀리 두는 것이 좋습니다.

이것을 달성하는 방법이 있습니까? 아니면 이러한 레이블을 수동으로 배치해야합니까?

답변

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

윤곽선에 사용되는 데이터 포인트를 가져옵니다. cp

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

다음이 실행될 때마다 레이블의 배치를 무작위로 선택합니다 (가장자리에 매우 가까운 값 제외). 레이블이 여전히 모서리에 너무 가깝거나 인접한 윤곽선에 대한 레이블이 겹치는 경우 다시 실행하여 다른 배치를 얻을 수 있습니다.

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

등고선 레이블 배치 문제는 최소한 버전 9로 거슬러 올라갑니다. 2014 년 WRI에서받은 코멘트 :

ContourLabels의 문제는 기존 문제이며 현재 개발자가 작업 중입니다. 불편 함을 이해하고 귀하가 제안한 해결 방법은 사용자가 레이블이 잘리지 않도록 권장하는 몇 가지 트릭이기도합니다. 이러한 해결 방법 외에 ContourLabels의 값을 f [x, y, z] 형식의 함수로 사용해 볼 수 있습니다. 즉, 사용자 지정 레이블을 만들 수 있습니다. 문서의 세부 사항 섹션을 참조하십시오.http://reference.wolfram.com/mathematica/ref/ContourLabels.html

제안 된 두 가지 해결 방법은 다음과 같습니다.

  1. PlotRangePadding을 증가시켜 플롯 주변에 가장자리의 레이블을위한 공간을 제공합니다.
  2. WRI가 제안한대로 함수와 함께 ContourLabels 옵션을 사용하여 수동으로 가장자리에 레이블을 배치합니다.