melhores ContourLabels para ContourPlot

Aug 30 2020

Quando eu uso o ContourPlot, prefiro usar ContourLabels em vez de PlotLegends. No entanto, os rótulos costumam ser exibidos bem próximos ao quadro, portanto, às vezes pode ser difícil lê-los.

Exemplo:

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

Como você pode ver, alguns números são colocados bem próximos aos eixos. Uma vez que há espaço suficiente no terreno onde eles podem ser colocados, eu preferiria que eles ficassem um pouco mais afastados da moldura.

Existe uma maneira de conseguir isso? Ou eu precisaria colocar esses rótulos manualmente?

Respostas

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

Obtenha os pontos de dados usados ​​para os contornos em cp

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

Cada vez que o seguinte for executado, ele escolherá aleatoriamente um posicionamento para as etiquetas (excluindo os valores muito próximos das bordas). Se os rótulos ainda estiverem muito próximos das bordas ou aqueles para contornos adjacentes se sobrepõem, você pode executar novamente para obter um posicionamento diferente.

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

Este problema de colocação de rótulos de contorno remonta pelo menos à versão 9. Um comentário que recebi do WRI em 2014:

O problema com ContourLabels já existe e está sendo trabalhado por nossos desenvolvedores. Eu entendo que isso é um inconveniente e as soluções alternativas que você sugeriu também são alguns dos truques que sugerimos que os usuários façam para evitar que os rótulos sejam truncados. Além dessas soluções alternativas, você pode tentar o valor de ContourLabels para serem funções da forma f [x, y, z], ou seja, fazer rótulos personalizados. Consulte a seção Detalhes da documentação:http://reference.wolfram.com/mathematica/ref/ContourLabels.html

As duas soluções alternativas sugeridas são

  1. aumentar PlotRangePadding, para dar espaço ao redor do gráfico para etiquetas nas bordas, e
  2. posicione manualmente os rótulos na borda usando a opção ContourLabels com funções, como WRI sugeriu