лучше ContourLabels для ContourPlot
Когда я использую ContourPlot, я предпочитаю использовать ContourLabels, а не PlotLegends. Однако метки часто отображаются очень близко к кадру, поэтому их иногда бывает трудно прочитать.
Пример:
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. Комментарий, который я получил от WRI в 2014 году:
Проблема с ContourLabels уже существует, и в настоящее время над ней работают наши разработчики. Я понимаю, что это неудобство, и предлагаемые вами обходные пути также являются некоторыми из приемов, которые мы предлагаем пользователям делать, чтобы избежать усечения ярлыков. Помимо этих обходных путей, вы можете попробовать значение ContourLabels как функции вида f [x, y, z], то есть создать собственные метки. См. В разделе «Подробности» документации:http://reference.wolfram.com/mathematica/ref/ContourLabels.html
Предлагаются два обходных пути:
- увеличьте PlotRangePadding, чтобы вокруг графика осталось место для надписей по краям, и
- вручную разместите метки на краю, используя параметр ContourLabels с функциями, как предлагает WRI