Qualche problema con pgfplots

Messaggioda marco2132k » 21/03/2020, 19:27

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?
marco2132k
Average Member
Average Member
 
Messaggio: 521 di 564
Iscritto il: 18/02/2018, 23:52

Re: Qualche problema con pgfplots

Messaggioda gugo82 » 21/03/2020, 20:38

TikZ?
Did you exchange
A walk on part in the war
For a lead role in a cage? (Roger Waters)
Avatar utente
gugo82
Moderatore globale
Moderatore globale
 
Messaggio: 23484 di 23972
Iscritto il: 12/10/2007, 23:58
Località: Napoli

Re: Qualche problema con pgfplots

Messaggioda marco2132k » 21/03/2020, 21:33

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.
marco2132k
Average Member
Average Member
 
Messaggio: 522 di 564
Iscritto il: 18/02/2018, 23:52

Re: Qualche problema con pgfplots

Messaggioda Sergio » 21/03/2020, 22:59

Dopo aver provato con entusiasmo TikZ e pgfplots... mi sono stufato. Ormai uso sempre asymptote, che presenta chiari vantaggi soprattutto per i grafici 3D (creo i pdf col comando asy, poi \includegraphics).
Non ho provato con funzioni come le tue, ma in generale si usa una sintassi del tipo:
Codice:
real f(real x) {
  return sqrt(x);
}
path s = graph(f, 0, 2, operator..);
draw(s, L=Label("$y=f(x)$", position=EndPoint));

dove quell'operator.. è un parametro che serve a "lisciare" le curve.
"Se vuoi un anno di prosperità coltiva del riso. Se vuoi dieci anni di prosperità pianta degli alberi. Se vuoi cento anni di prosperità istruisci degli uomini" (proverbio cinese). E invece... viewtopic.php?p=236293#p236293
Avatar utente
Sergio
Cannot live without
Cannot live without
 
Messaggio: 6680 di 6854
Iscritto il: 26/04/2004, 10:56
Località: Roma

Re: Qualche problema con pgfplots

Messaggioda Raptorista » 22/03/2020, 10:37

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.
Un matematico ha scritto:... come mia nonna che vuole da anni il sistema per vincere al lotto e crede che io, in quanto matematico, sia fallito perché non glielo trovo


Immagine
Avatar utente
Raptorista
Moderatore
Moderatore
 
Messaggio: 5410 di 5421
Iscritto il: 28/09/2008, 19:58

Re: Qualche problema con pgfplots

Messaggioda G.D. » 22/03/2020, 17:13

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}
"Everybody lies"
"La morte sorride a tutti: un uomo non può fare altro che sorriderle di rimando"
"Eliminato l'impossibile, ciò che resta, per improbabile che sia, deve essere la verità"
"No! Provare no! Fare. O non fare. Non c'è provare!"
Avatar utente
G.D.
Cannot live without
Cannot live without
 
Messaggio: 5107 di 5116
Iscritto il: 11/05/2007, 22:00

Re: Qualche problema con pgfplots

Messaggioda claudio86 » 23/03/2020, 17:38

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
"This theorem, as many others, is proven by writing zero in a creative way…"
claudio86
Average Member
Average Member
 
Messaggio: 538 di 551
Iscritto il: 09/01/2011, 15:12

Re: Qualche problema con pgfplots

Messaggioda marco2132k » 23/03/2020, 22:24

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
marco2132k
Average Member
Average Member
 
Messaggio: 523 di 564
Iscritto il: 18/02/2018, 23:52

Re: Qualche problema con pgfplots

Messaggioda claudio86 » 24/03/2020, 08:27

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à.
"This theorem, as many others, is proven by writing zero in a creative way…"
claudio86
Average Member
Average Member
 
Messaggio: 539 di 551
Iscritto il: 09/01/2011, 15:12

Re: Qualche problema con pgfplots

Messaggioda gugo82 » 24/03/2020, 12:05

@ Sergio: Asymptote mi sembra bruttino, comunque... Non che TikZ sia meglio, però! :lol:
Did you exchange
A walk on part in the war
For a lead role in a cage? (Roger Waters)
Avatar utente
gugo82
Moderatore globale
Moderatore globale
 
Messaggio: 23515 di 23972
Iscritto il: 12/10/2007, 23:58
Località: Napoli

Prossimo

Torna a Generale

Chi c’è in linea

Visitano il forum: Google [Bot] e 62 ospiti