mejores ContourLabels para ContourPlot

Aug 30 2020

Cuando uso ContourPlot, prefiero usar ContourLabels en lugar de PlotLegends. Sin embargo, las etiquetas a menudo se muestran muy cerca del marco, por lo que a veces puede resultar difícil leerlas.

Ejemplo:

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

Como puede ver, algunos números se colocan muy cerca de los ejes. Dado que hay suficiente espacio en la trama donde podrían colocarse, preferiría tenerlos un poco más lejos del marco.

¿Hay alguna forma de lograrlo? ¿O tendría que colocar esas etiquetas manualmente?

Respuestas

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

Obtenga los puntos de datos utilizados para los contornos en cp

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

Cada vez que se ejecute lo siguiente, elegirá aleatoriamente una ubicación para las etiquetas (excluyendo los valores muy cerca de los bordes). Si las etiquetas todavía están demasiado cerca de los bordes o las de los contornos adyacentes se superponen, puede ejecutar nuevamente para obtener una ubicación 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 ubicación de las etiquetas de contorno se remonta al menos a la versión 9. Un comentario que recibí de WRI en 2014:

El problema con ContourLabels es uno existente, nuestros desarrolladores están trabajando en él actualmente. Entiendo que esto es un inconveniente y las soluciones que sugirió son también algunos de los trucos que sugerimos a los usuarios para evitar que las etiquetas se trunquen. Aparte de estas soluciones, puede probar el valor de ContourLabels para que sean funciones de la forma f [x, y, z], es decir, crear etiquetas personalizadas. Consulte la sección Detalles de la documentación:http://reference.wolfram.com/mathematica/ref/ContourLabels.html

Las dos soluciones alternativas sugeridas son

  1. aumentar PlotRangePadding, para dar espacio alrededor del gráfico para las etiquetas en los bordes, y
  2. coloque manualmente las etiquetas en el borde usando la opción ContourLabels con funciones, como sugirió WRI