ContourPlot을위한 더 나은 ContourLabels
ContourPlot을 사용할 때 PlotLegends를 사용하는 것보다 ContourLabels를 사용하는 것을 선호합니다. 그러나 레이블은 종종 프레임에 매우 가깝게 표시되므로 때때로 읽기가 어려울 수 있습니다.
예:
ContourPlot[
Sin[x^2 + 2 y],
{x, 0, 2}, {y, 0, 2},
Contours -> 5,
ContourLabels -> True
]
보시다시피 일부 숫자는 축에 매우 가깝게 배치됩니다. 대신 배치 할 수있는 플롯에 충분한 공간이 있으므로 프레임에서 조금 더 멀리 두는 것이 좋습니다.
이것을 달성하는 방법이 있습니까? 아니면 이러한 레이블을 수동으로 배치해야합니까?
답변
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]]]}]
등고선 레이블 배치 문제는 최소한 버전 9로 거슬러 올라갑니다. 2014 년 WRI에서받은 코멘트 :
ContourLabels의 문제는 기존 문제이며 현재 개발자가 작업 중입니다. 불편 함을 이해하고 귀하가 제안한 해결 방법은 사용자가 레이블이 잘리지 않도록 권장하는 몇 가지 트릭이기도합니다. 이러한 해결 방법 외에 ContourLabels의 값을 f [x, y, z] 형식의 함수로 사용해 볼 수 있습니다. 즉, 사용자 지정 레이블을 만들 수 있습니다. 문서의 세부 사항 섹션을 참조하십시오.http://reference.wolfram.com/mathematica/ref/ContourLabels.html
제안 된 두 가지 해결 방법은 다음과 같습니다.
- PlotRangePadding을 증가시켜 플롯 주변에 가장자리의 레이블을위한 공간을 제공합니다.
- WRI가 제안한대로 함수와 함께 ContourLabels 옵션을 사용하여 수동으로 가장자리에 레이블을 배치합니다.