meglio ContourLabels per ContourPlot

Aug 30 2020

Quando uso ContourPlot preferisco usare ContourLabels piuttosto che usare PlotLegends. Tuttavia, le etichette vengono spesso visualizzate molto vicino alla cornice, quindi a volte può essere difficile leggerle.

Esempio:

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

Come puoi vedere alcuni numeri sono posti molto vicino agli assi. Dato che c'è abbastanza spazio nella trama dove potrebbero essere posizionati, preferirei averli un po 'più lontani dall'inquadratura.

C'è un modo per raggiungere questo obiettivo? O dovrei posizionare manualmente quelle etichette?

Risposte

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

Ottieni i punti dati utilizzati per i contorni in formato cp

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

Ogni volta che viene eseguito quanto segue, sceglierà in modo casuale un posizionamento per le etichette (esclusi i valori molto vicini ai bordi). Se le etichette sono ancora troppo vicine ai bordi o quelle per i contorni adiacenti si sovrappongono, è possibile eseguire di nuovo per ottenere un posizionamento diverso.

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

Questo problema di posizionamento delle etichette di contorno risale almeno alla versione 9. Un commento che ho ricevuto da WRI nel 2014:

Il problema con ContourLabels è già esistente, attualmente i nostri sviluppatori stanno lavorando. Capisco che questo sia un inconveniente e le soluzioni alternative che hai suggerito sono anche alcuni dei trucchi che suggeriamo agli utenti di fare per evitare che le etichette vengano troncate. Oltre a queste soluzioni alternative, è possibile provare che il valore di ContourLabels sia funzioni della forma f [x, y, z], ovvero creare etichette personalizzate. Vedere nella sezione Dettagli della documentazione:http://reference.wolfram.com/mathematica/ref/ContourLabels.html

Le due soluzioni alternative suggerite sono

  1. aumentare PlotRangePadding, per dare spazio intorno al grafico per le etichette sui bordi e
  2. posizionare manualmente le etichette sul bordo utilizzando l'opzione ContourLabels con funzioni, come suggerito da WRI