Pagina 1 di 2

Qualche problema con pgfplots

MessaggioInviato: 21/03/2020, 19:27
da marco2132k
Ciao. Mi sto scrivendo degli appunti di analisi (in \( \LaTeX{} \)), e mi piacerebbe inserirvici qualche grafico di funzione. Apparentemente pgfplots è il pacchetto più sensato per fare questo genere di cose, quindi ho provato a smanettare un po' con quello.

L'idea è di typesettare i grafici in un primo momento (usando qualcosa come latexit) e includere poi .pdf; ciò per risparmiare tempo in fase di compilazione. Questo non dovrebbe influire sull'omogeneità delle "cose tipografiche" (almeno non tanto quanto succederebbe se usassi python + matplotlib, o altre amenità).

Ho giocato un attimo con il codice per \( x\mapsto x^n \), distinguendo i casi \( n\geqq 0 \) (un grafico per \( n \) pari e uno per \(
n \) dispari), e per \( n<0 \) (ancora con un grafico per \( n \) pari e un altro per \( n \) dispari), e questo è il risultato
Codice:
    \begin{tikzpicture}
      \begin{axis}[height=5cm,
        domain=-10:10,
        restrict y to domain=-10:10,
        axis x line=middle,
        axis y line=middle,
        xlabel=$ x $,
        ylabel=$ y $,
        enlargelimits,
        xtick={0},
        ytick={0}]
        \addplot[samples=400]{x^2};
        \addplot[samples=400]{x^4};
        \addplot[samples=400]{x^6};
      \end{axis}
    \end{tikzpicture}

    \begin{tikzpicture}
      \begin{axis}[height=5cm,
        domain=-10:10,
        restrict y to domain=-10:10,
        axis x line=middle,
        axis y line=middle,       
        xlabel=$ x $,
        ylabel=$ y $,
        enlargelimits,
        xtick={0},
        ytick={0}]
        \addplot[samples=400]{x^1};
        \addplot[samples=400]{x^3};
        \addplot[samples=400]{x^5};
      \end{axis}
    \end{tikzpicture}

    \begin{tikzpicture}
      \begin{axis}[height=5cm,
        domain=10:10,
        restrict y to domain=-10:10,
        axis x line=middle,
        axis y line=middle,
        xlabel=$ x $,
        ylabel=$ y $,
        enlargelimits,
        xtick={0},
        ytick={0}]
        \addplot[domain=-10:-0.015,samples=400]{1/(x^2)};
        \addplot[domain=0.015:10,samples=400]{1/(x^2)};

        \addplot[domain=-10:-0.015,samples=400]{1/(x^4)};
        \addplot[domain=0.015:10,samples=400]{1/(x^4)};

        \addplot[domain=-10:-0.015,samples=400]{1/(x^6)};
        \addplot[domain=0.015:10,samples=400]{1/(x^6)};
      \end{axis}
    \end{tikzpicture}

    \begin{tikzpicture}
      \begin{axis}[height=5cm,
        domain=-10:10,
        restrict y to domain=-10:10,
        axis x line=middle,
        axis y line=middle,
        xlabel=$ x $,
        enlargelimits,
        ylabel=$ y $,
        xtick={0},
        ytick={0}]
        \addplot[domain=-10:-0.015,samples=400]{1/(x^1)};
        \addplot[domain=0.015:10,samples=400]{1/(x^1)};

        \addplot[domain=-10:-0.015,samples=400]{1/(x^3)};
        \addplot[domain=0.015:10,samples=400]{1/(x^3)};

        \addplot[domain=-10:-0.015,samples=400]{1/(x^5)};
        \addplot[domain=0.015:10,samples=400]{1/(x^5)};
      \end{axis}
    \end{tikzpicture}

È un casino! I grafici vengono brutti anche aumentando a dismisura i samples; devo aggiungere restrict y to domain=-10:10 sennò succede chissà che errore di overlfow nonostante io abbia già specificato il range in cui disegnare (e quindi calcolare i punti); anche solo per plottare una cosa come \( x\mapsto x^{-2} \) bisogna scrivere un papiro; ecc.

Quindi 1) come posso correggere il codice che ho scritto per ottenere un risultato decente? 2) Conoscete/usate qualche alternativa a pgfplots?

Re: Qualche problema con pgfplots

MessaggioInviato: 21/03/2020, 20:38
da gugo82
TikZ?

Re: Qualche problema con pgfplots

MessaggioInviato: 21/03/2020, 21:33
da marco2132k
In realtà pgfplots è più o meno un insieme di macros di TikZ, scritte proprio per semplificare la stesura di grafici. Comunque proverò a buttarci un occhio, magari per fare cose semplici va bene.

Re: Qualche problema con pgfplots

MessaggioInviato: 22/03/2020, 10:37
da Raptorista
marco2132k ha scritto:Questo non dovrebbe influire sull'omogeneità delle "cose tipografiche" (almeno non tanto quanto succederebbe se usassi python + matplotlib, o altre amenità).

Matplotlib permette di esportare in pgf, il che risolve questo problema.

Re: Qualche problema con pgfplots

MessaggioInviato: 22/03/2020, 17:13
da G.D.
Forse non ho ben capito qual è il problema, però tentare non nuoce...

Codice:
\begin{tikzpicture}
    \begin{axis}[
                xmin = -10, xmax = 10,
                ymin = -1, ymax = 10,
                axis lines = left,
                axis x line = center,
                axis y line = center,
                xtick = \empty,
                ytick = \empty
                ]
        \addplot[
                domain = -4:4,
                samples = 100,
                line width = 0.5pt,
                color = blue
                ]
                {x^2};
        \addplot[
                domain = -3:3,
                samples = 100,
                line width = 0.5pt,
                color=red
                ]
                {x^4};
        \addplot[
                domain = -2:2,
                samples=100,
                line width=0.5pt,
                color=black
                ]
                {x^6};
    \end{axis}
\end{tikzpicture}

Re: Qualche problema con pgfplots

MessaggioInviato: 23/03/2020, 17:38
da claudio86
Cosa intendi per "brutti"? Perché a me sembrano normalissimi grafici.
Magari restringi un po' il dominio, aggiungi dei colori, disponili in una griglia, e aggiungi una legenda. Altrimenti, hai qualche esempio del risultato che vorresti ottenere?

Codice:
\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\usepgfplotslibrary{groupplots}
\usepgfplotslibrary{colorbrewer}

% Set compatibility
\pgfplotsset{compat=1.16}

% Set color index
\pgfplotsset{
    cycle list/Set1-9,
    cycle multiindex* list = {
        % mark list*\nextlist
        % linestyles*\nextlist
        Set1-9\nextlist
    },
}

\begin{document}
\begin{tikzpicture}
  \begin{groupplot}[
      group style = {
        group size = 2 by 2,
        vertical sep = 2.5cm,
      },
      height = 5cm,
      domain = -3:3,
      samples = 400,
      restrict y to domain = -3:3,
      axis x line = middle,
      axis y line = middle,
      xlabel = $x$,
      ylabel = $y$,
      enlargelimits = true,
      xtick = \empty,
      ytick = \empty,
      legend columns = 2,
      legend style = {
        at = {(0.5, -0.1)},
        anchor = north,
      },
    ]
    \nextgroupplot[
      title = {$x^n : n$ even},
    ]
    \pgfplotsinvokeforeach{2,4,6,8}{
      \addplot+{x^#1};
      \addlegendentry{$n = #1$};
    }

    \nextgroupplot[
      title = {$x^n : n$ odd},
    ]
    \pgfplotsinvokeforeach{1,3,5,7}{
      \addplot+{x^#1};
      \addlegendentry{$n = #1$};
    }

    \nextgroupplot[
      title = {$x^\frac{1}{n} : n$ even},
    ]
    \pgfplotsinvokeforeach{2,4,6,8}{
      \addplot+{1/x^#1};
    }

    \nextgroupplot[
      title = {$x^\frac{1}{n} : n$ odd},
    ]
    \pgfplotsinvokeforeach{1,3,5,7}{
      \addplot+{1/x^#1};
    }
  \end{groupplot}
\end{tikzpicture}

\end{document}


devo aggiungere restrict y to domain=-10:10 sennò succede chissà che errore di overlfow nonostante io abbia già specificato il range in cui disegnare (e quindi calcolare i punti);

In realtà no. PGFPlots prima disegna il grafico su tutti i punti del dominio, poi lo ritaglia per farlo stare dentro xmin, xmax, ymin e ymax1.

Note

  1. So questa cosa perché avevo una serie con molti punti della quale volevo un grafico molto zoomato di una piccola parte. Senza usare restrict x to domain avevo un errore "dimension too large", perché il grafico completo era lungo parecchi metri :D

Re: Qualche problema con pgfplots

MessaggioInviato: 23/03/2020, 22:24
da marco2132k
Allora. Intanto grazie a tutti!

Forse non ho detto che non conosco né pgfplots né matplotlib né altro, e che quindi l'idea era anche capire che cosa mi convenisse provare a usare, tra tutti questi.

Pgfplots è carino, però mi impaccia la filosofia di fare una cosa sola e bene, perché non mi serve una cosa troppo elaborata (lo stesso discorso vale per matplotlib).

Credo che metapost sia più vicino a quello che avevo in mente: fa tutto (grafici di funzione con asymptote che ha una sintassi simile e disegnini di rette piani ecc.), sembra abbastanza semplice, ecc. Mi ispira di più, vediamo se ho voglia di provarlo.

claudio86 ha scritto:In realtà no. PGFPlots prima disegna il grafico su tutti i punti del dominio, poi lo ritaglia per farlo stare dentro xmin, xmax, ymin e ymax1.
Ecco, questo lo ignoravo. :-D

Re: Qualche problema con pgfplots

MessaggioInviato: 24/03/2020, 08:27
da claudio86
Qualche tempo fa avevo cercato un po' di informazioni su metapost per vedere se potessi usarlo come alternativa a PGFPlots e TikZ. La mia impressione è che a livello "base" metapost potrebbe essere anche meglio, in fondo si tratta di disegnare linee e punti, e il linguaggio è più piacevole da usare (e.g. guarda i cicli nel mio esempio precedente, "piacevole" non è decisamente un aggettivo che userei per descrivere la programmazione in LaTeX).
Però, la soluzione standard al momento su LaTeX è TikZ, che è molto più maturo e quindi si trova molto più supporto e molte più librerie. Quello che serviva maggiormente a me erano grafici di serie temporali, e PGFPlots era meglio di qualsiasi alternativa avessi trovato per metapost.
La soluzione che ho adottato per grafici molto complessi è di usare LuaLaTeX e gestire dinamiche complicate in Lua (che però a volte può essere davvero lento).

Il mio workflow generale comunque è quello di analizzare i dati e generare grafici con matplotlib, che è molto più comodo a livello "esplorativo" e molto più rapido per cambiare parametri e tipo di visualizzazione, ma poi di generare i grafici in LaTeX con PGFPlots direttamente da file CSV.
Ho provato qualche volta ad esportare direttamente da matplotlib a PGFPlots ma non sono mai stato soddisfatto. Per grafici complessi, con molte annotazioni o assi in posizioni strane, il codice generato semplicemente non compilava. Anche quando compilava, avrei comunque dovuto modificare il codice generato per ottimizzarlo al layout specifico o aggiungere annotazioni, il ché aggiunge un passaggio manuale da ripetere ogni volta che cambia il dataset.

Un altro vantaggio di generare i grafici direttamente in LaTeX è che così sono sicuro di avere il dataset incluso nei sorgenti dell'articolo. Ho visto un paio di volte dei colleghi generare grafici con matplotlib, vedersi suggerire dai revisori modifiche ai grafici, e non trovare più il dataset originale.

Ho visto consigliare asymptote molte volte per grafici tridimensionali, di cui però non ho mai avuto bisogno, quindi non mi sono mai realmente interessato.

Qualunque soluzione dovessi scegliere, se vuoi continuare a usare LaTeX in modo efficace, ti consiglio di sfogliare le discussioni su TeX StackExchange, in particolare quelle relative agli strumenti che ti interessano (e.g. PGFPlots). È un buon modo per capirne le potenzialità.

Re: Qualche problema con pgfplots

MessaggioInviato: 24/03/2020, 12:05
da gugo82
@ Sergio: Asymptote mi sembra bruttino, comunque... Non che TikZ sia meglio, però! :lol:

Re: Qualche problema con pgfplots

MessaggioInviato: 26/03/2020, 16:35
da kaspar
@ gugo82,
Scherzi? 1300 pagine :lol: