[RISOLTO] Aspect ratio sballato figura TikZ

  • Creatore
    Topic
  • #112097
    Up
    0
    Down
    ::


    Ciao a tutti,

    ho un problema che non riesco a risolvere con la creazione di un immagine (anche abbastanza facile) in TiKZ.

    Considerate i due esempi qui sotto:

    `\documentclass{standalone}

    \usepackage{tikz}
    \usepackage{pgfplots}

    \begin{document}

    \begin{tikzpicture}
    \begin{axis}[
    xmin=0, xmax=2,
    ymin=0, ymax=3,
    width=2\textwidth,
    height=3\textwidth,
    xmajorticks=false,
    ymajorticks=false,
    xmajorgrids,
    ymajorgrids,
    ]
    \end{axis}
    \end{tikzpicture}

    \end{document}`

    e

    `\documentclass{standalone}

    \usepackage{tikz}
    \usepackage{pgfplots}

    \begin{document}

    \begin{tikzpicture}
    \begin{axis}[
    xmin=0, xmax=2,
    ymin=0, ymax=3,
    width=0.2\textwidth,
    height=0.3\textwidth,
    xmajorticks=false,
    ymajorticks=false,
    xmajorgrids,
    ymajorgrids,
    ]
    \end{axis}
    \end{tikzpicture}

    \end{document}`

    La sola differenza è nelle dimensioni, in un caso 2\textwidth e 3\textwidth, nell’altro 0.2\textwidth e 0.3\textwidth.

    Il risultato è un rettangolo che ha aspect ratio 3:2 (come ci si aspetta) nel primo caso, mentre nel secondo il rapporto diventa qualcosa attorno il 2.5:1, chiaramente sballato (cosa che si può vedere anche dal fatto che negli output le griglie interne ai rettangoli creano rettangoli invece di quadrati). Il problema, inoltre, è più marcato quanto più piccole sono le dimensioni richieste.

    Ho provato a cercare sul manuale, ma non ho trovato niente di utile (ho sicuramente guardato nella sezione sbagliata, ma è così ampio che è facile perdercisi).

    Perché l’aspect ratio cambia con le dimensioni assolute richieste? Cosa sto sbagliando?

    Grazie mille!

Visualizzazione 6 filoni di risposte
  • Autore
    Risposte
    • #112098
      robitex
      Amministratore del forum
        Up
        0
        Down
        ::


        Ciao. Credo che il problema sia la ricorsività della definizione dimensionale.
        La classe standalone determina le dimensioni della pagina dal contenuto, e il contenuto determina le sue dimensioni da quelle della pagina.
        È facile verificarlo. Usa una classe standard tipo article.
        R.

      • #112099
        Up
        0
        Down
        ::


        Ciao,

        grazie mille della risposta!

        Purtroppo il problema però non è quello, la classe standalone in realtà l’ho usata proprio per evitare di usare classi più complicate che magari introducevano definizioni che confliggevano in qualche modo: il problema originale che mi ha portato al MWE sopra mi si presenta proprio in un articolo, anche togliendo tutto il superfluo.

      • #112100
        OldClaudio
        Partecipante
          Up
          0
          Down
          ::


          Benvenuto nel forum; e benvenuto il tuo quesito che mostra molto bene le tue capacità di osservazione e di produrre due esempi minimi compilabili, cosa che spesso coloro che pongono quesiti non fanno. Bravo.

          Secondo me non c’è niente di male in quello che ti succede. In questo senso: pgfplots cerca di far stare un numero intero di unità di disegno, che non sono le unità geometriche, in modo da dividere le dimensioni date in un numero intero di intervalli, in modo che le scale degli assi siano ragionevolmente divise con le tichette delle scale che possibilmente non si sovrappongano.

          Invece di passare da un foglio di 2\textwidth per 3\textwidth, indica le dimensioni con unità assolute, per esempio 100mm per 150mm. Poi metti true xmajortiks e ymagiortiks; compila e guarda bene lo schermo; se misuri con ina squadretta o un righello trasparente vedi che i quadrati della griglia sono solo apporossimativamante quadrati, ma le etichette della griglia vengono benissimo.

          Diminuisci gradatamente le dimensioni; passando a 80mm per 120mm; poi a 60mm per 90mm misurando sempre i quadrati che ti vengono fuori e controlla le gradazioni degli assi; Anche se sembrano quadrati la rete ha fori rettangolari.

          Prosegui rimpicciolendo le dimensioni ma mantenendo sempre la gradazione degli assi; i quasi quadrati diventano sempre più rettangolari, perché pgfplots cambia le dimensioni con un multiplo intero degli intervalli di ciascun asse tali che non siano mai troppo vicini.

          se disponi di un ottimo visore di file pdf (io dispongo anche di Adobe Acrobat Pro, ma credo che altri ottimi visualizzatori abbiano la funzionalità che io userei qui) fai si che vengano mostrati nela schermata dela pagina anche i righelli graduati nelle untità di misura. Puoi quindi vedere che con le dimensioni di 2\textwidth per 3\textwidth il disegno smarginato ha dimensioni di (circa) 220mm per 330mm, ma i due numeri esatti sono molto vicini al rapporto 3:2, ma non esattamente 3:2. Via via che diminuisci le dimensioni specificate in millimetri i “quadrati” sembrano sempre quadrati, finché scendendo sotto ai 50mm per 75mm, le gradazioni degli assi cambiano e i “quadrati” diventano sempre più rettangolari pur restando abbastanza quadrati, solo che corrispondono a divisioni degli assi diversi; guarda sempre in numeri riportati vicino alle coordinate e usa correttamente il righello.

          In sostanza non sbagli niente; è il sottostante tikz che cambia le carte in tavola in vista della leggibilità del disegno, non in vista del rispetto delle specifiche assegnate. Probabilmente è possibile stabilire dei valori specifici per la distanza delle gradazioni degli assi, anzi sono sicuro che si può fare, ma dovrei leggere la lunga documentazione per trovare come.

        • #112101
          Up
          0
          Down
          ::


          Ciao,

          grazie mille, per la risposta molto completa e per i complimenti iniziali 🙂

          Se capisco bene quello che dici, sostanzialmente è un problema di “approssimazione” delle dimensioni, che vengono portate al valore più vicino che rende possibile dividere il lato in N intervalli uguali, dove N è il numero di tacchette che tikz decide di mettere, numero che non è sempre uguale ma dipende dalle dimensioni stesse. Per dimensioni grandi, questa approssimazione porta a piccoli errori di aspect ratio, ma per dimensioni piccole porta a errori più visibili. Corretto?

          Tutto questo ha senso, ma a me servirebbe veramente avere un rapporto di dimensioni fisso, perché quel rettangolo dovrebbe rappresentare il dominio di calcolo in cui rappresentare poi i risultati delle mie simulazioni, e quindi mi servirebbe ovviamente che questo dominio di calcolo non venisse distorto.

          Capisco benissimo quando dici che

          Probabilmente è possibile stabilire dei valori specifici per la distanza delle gradazioni degli assi, anzi sono sicuro che si può fare, ma dovrei leggere la lunga documentazione per trovare come.

          Mi chiedevo però se magari avessi idea di qualche keyword che possa aiutarmi a navigare la documentazione in maniera un po’ più mirata.

          Oppure, d’altra parte, non è che invece usare l’ambiente axis sia sbagliato a priori per questo tipo di rappresentazione e in realtà sarebbe più furbo usarne un ambiente diverso?

          Grazie mille ancora!

        • #112102
          OldClaudio
          Partecipante
            Up
            0
            Down
            ::


            Credo che is possa fare stabilendo il valore del versore lugo x e del versore lungo y; ciascuno di questi versori vale 1cm di default; però con le istruzioni che si leggono nella pagina 10 del manuale di tikz si possono cambiare in quello che si vuole., in particolare queste sono proprietà dell’ambiente tikzpicture, quindi è ovvioa che per ogni ambiente tikzpicture si potrebbero specificare lunghezze diverse.

          • #112103
            robitex
            Amministratore del forum
              Up
              0
              Down
              ::


              Ciao.
              Ho modificato i due esempi minimi definendo la stessa dimensione per tutti e due pari a 20cm.
              `\newdimen\tw
              \tw=20cm` e poi l’ho passata alle dimensioni della tela del grafico:`width=2\tw,
              height=3\tw,` nel primo sorgente e `width=0.2\tw,
              height=0.3\tw,`nel secondo.

              Ho poi calcolato il rapporto tra l’altezza e la larghezza della pagina, ottenuta dalla composizione dei due sorgenti ottenendo:
              `
              caso 2, 3 –> 1,5204
              caso 0.2, 0.3 –> 1,8230
              `

              Sono diversi, come dici tu.
              La dimensione della linea di bordo influisce sui rapporti della pagina perché il suo spessore non viene scalato, ma non certo così tanto da giustificare una tale differenza. E poi pgfplots potrebbe tenerne conto (come infatti è).
              La spiegazione di una tale differenza va cercata nel manuale di pgfplots (apribile a schermo in un attimo con il comando da terminale $ texdoc pgfplots), dove infatti trovo:
              `Please note that pgfplots only estimates the size needed for axis- and tick labels. The estimate
              assumes a fixed amount of space for anything which is outside of the axis box. This has the effect that
              the final images may be slightly larger or slightly smaller than the prescribed dimensions.`

              Quindi per imporre un’esatta dimensione della tela del grafico, continuo ad apsettarmi di trovare nel manuale di pgfplots l’opzione corrispondente.
              E infatti 🙂 più avanti leggo:
              `If scale only axis is enabled, width and height apply only to the axis rectangle. Consequently, the
              resulting figure is larger that width and height (because of any axis descriptions). However, the axis
              box has exactly the prescribed target dimensions.`
              Così aggiungo l’opzione scale only axis=true, e ricompilo e rialcolo i rapporti. Il risultato è:
              `
              caso 2, 3 –> 1,5000
              caso 0.2, 0.3 –> 1,5000
              `
              R.

              Scusa, ma mi son dimenticato darti il benvenuto sul forum, come usa fare da chi risponde a un post il cui Autore ha un contatore messaggi pari a 1 🙂

            • #112104
              Up
              0
              Down
              ::


              Grazie infinite! Sapevo che ci doveva essere una spiegazione nel manuale…purtroppo stavo cercando nel manuale sbagliato (quello di TiKZ invece di quello di pgfplots) 🙂

              Tutto risolto (e adesso si spiegano anche molte delle cose strane che succedevano in altri grafici che avevo fatto).

              Grazie mille a tutti e due per la disponibilità!

              Devo marcare in qualche modo la discussione come “risolta”?

          Visualizzazione 6 filoni di risposte
          • Devi essere connesso per rispondere a questo topic.

          Go to top