лучше ContourLabels для ContourPlot

Aug 30 2020

Когда я использую ContourPlot, я предпочитаю использовать ContourLabels, а не PlotLegends. Однако метки часто отображаются очень близко к кадру, поэтому их иногда бывает трудно прочитать.

Пример:

 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. Комментарий, который я получил от WRI в 2014 году:

Проблема с ContourLabels уже существует, и в настоящее время над ней работают наши разработчики. Я понимаю, что это неудобство, и предлагаемые вами обходные пути также являются некоторыми из приемов, которые мы предлагаем пользователям делать, чтобы избежать усечения ярлыков. Помимо этих обходных путей, вы можете попробовать значение ContourLabels как функции вида f [x, y, z], то есть создать собственные метки. См. В разделе «Подробности» документации:http://reference.wolfram.com/mathematica/ref/ContourLabels.html

Предлагаются два обходных пути:

  1. увеличьте PlotRangePadding, чтобы вокруг графика осталось место для надписей по краям, и
  2. вручную разместите метки на краю, используя параметр ContourLabels с функциями, как предлагает WRI