- Questo topic ha 19 risposte, 5 partecipanti ed è stato aggiornato l'ultima volta 12 anni, 5 mesi fa da
cfiandra.
-
CreatoreTopic
-
4 Aprile 2014 alle 18:36 #93785::
Vorrei generare due proiezioni ortogonali affiancate di uno stesso oggetto.
Sto cercando di farlo con “axis” in tikzpicture.
Nel codice qui sotto sarebbe una sfera, vista di fronte ( view {0}{0} ) e vista dall’alto ( view {0}{90} )
Quando compila però le due proiezioni appaiono di dimensioni diverse (vedi file allegato).
Cosa c’ è di sbagliato o mancante?\PassOptionsToPackage{table}{xcolor}
\documentclass[11pt]{article}
\usepackage{tikz}
\usepackage[italian]{babel}
\usepackage {color}
\usepackage{pgfplots}
\colorlet{lightblue}{blue!60}\begin{document}
\begin {figure}[htbp]
%\centering
\label{fig:1}
%sfera 1
%
\begin{tikzpicture}
% assi coordinate e vista
\begin{axis}
[ xmin=-4, xmax=4,
ymin=-4, ymax=4,
axis lines=none,
view={0}{0},
scale=1 ]
%
%disegna ellissoide 1
%tre semiassi
\def \a{2}
\def \b{2}
\def \c{2}
%
\addplot3
[ opacity = 0.5,
surf,
z buffer = sort,
samples = 21,
variable = \u,
variable y = \v,
domain = 0:180,
y domain = 0:360,
colormap name=gb,
colormap={gb}{color(0cm)=(lightblue); color(1cm)=(white)} ]
%
( {\a*sin(u)*cos(v) + \b*sin(u)*sin(v)},
{\b*sin(u)*sin(v) – \a*sin(u)*cos(v)},
{\c*cos(u)} );
%
\end{axis}
\end{tikzpicture}
%
%
\begin{tikzpicture}% assi coordinate e vista
\begin{axis}
[ xmin=-4, xmax=4,
ymin=-4, ymax=4,
axis lines=none,
view={0}{90},
scale=1 ]
%
%disegna ellissoide 2
%tre semiassi
\def \a{2}
\def \b{2}
\def \c{2}
%
\addplot3
[ opacity = 0.5,
surf,
z buffer = sort,
samples = 21,
variable = \u,
variable y = \v,
domain = 0:180,
y domain = 0:360,
colormap name=gb,
colormap={gb}{color(0cm)=(lightblue); color(1cm)=(white)} ]
%
( {\a*sin(u)*cos(v) + \b*sin(u)*sin(v)},
{\b*sin(u)*sin(v) – \a*sin(u)*cos(v)},
{\c*cos(u)} );
%
\end{axis}
\end{tikzpicture}
%
\caption {…….}
\end{figure}
%%%%%%%%%\end{document}
Attachments:
You must be logged in to view attached files. -
CreatoreTopic
-
AutoreRisposte
-
-
4 Aprile 2014 alle 19:14 #93786::
Per il tuo problema non so cosa risponderti, ma ti faccio notare un piccolo errore: Il comando [tt]\label[/tt] va dato o dentro l’argomento di [tt]\caption[/tt] o subito dopo quest’ultimo, perché il comando [tt]\caption[/tt] tra le varie cose aumenta anche il contatore delle figure. Se non fai così, non funziona il riferimento incrociato alla figura. Questo vale sia per le figure, sia per le tabelle.
-
5 Aprile 2014 alle 5:47 #93787
-
5 Aprile 2014 alle 7:54 #93788::
Grazie a Skevin93 per la dritta 🙂 .Liverpool” post=93375
sei sicuro che sia l’equazione di una sfera? A me non sembra.Già!
Nel tentativo di proporre un codice semplificato ho pasticciato con il copia e incolla. Il mio problema iniziale era un po’ più complicato, prevedendo di rappresentare ellissoidi ruotati attorno all’asse z e ho semplificato malamente le equazioni.
Ecco qui un codice che dovrebbe essere corretto.
\begin{document}
%%%%%%%%%
\begin {figure}[htbp] %sfera
%
\begin{tikzpicture}
% assi coordinate e vista
\begin{axis}
[ xmin=-4, xmax=4,
ymin=-4, ymax=4,
axis lines=none,
view={0}{0},
scale=1 ]
%
%disegna sfera 1
\def \r{2}
%
\addplot3
[ opacity = 0.5,
surf,
z buffer = sort,
samples = 21,
variable = \u,
variable y = \v,
domain = 0:180,
y domain = 0:360,
colormap name=gb,
colormap={gb}{color(0cm)=(lightblue); color(1cm)=(white)} ]
%
( {\r*sin(u)*cos(v)},
{\r*sin(u)*sin(v)},
{\r*cos(u)} );
%
\end{axis}
\end{tikzpicture}
%
%
\begin{tikzpicture}
% assi coordinate e vista
\begin{axis}
[ xmin=-4, xmax=4,
ymin=-4, ymax=4,
axis lines=none,
view={0}{90},
scale=1 ]
%
%disegna sfera 2
\def \r{2}
%
\addplot3
[ opacity = 0.5,
surf,
z buffer = sort,
samples = 21,
variable = \u,
variable y = \v,
domain = 0:180,
y domain = 0:360,
colormap name=gb,
colormap={gb}{color(0cm)=(lightblue); color(1cm)=(white)} ]
%
( {\r*sin(u)*cos(v) },
{\r*sin(u)*sin(v) },
{\r*cos(u)} );
%
\end{axis}
\end{tikzpicture}
%
\caption {…….}
\label{fig:1}
\end{figure}
%%%%%%%%%
\end{document}
Ma la figura che si ottiene è deforme e non ha le dimensioni attese (allegato).
Attachments:
You must be logged in to view attached files. -
5 Aprile 2014 alle 8:08 #93789::
Problema 2: nella visione frontale non hai indicato le dimensioni dell’asse z, quindi il pacchetto le calcola a piacere, mentre quelle dell’asse x sono fissate.Problema 3: non hai indicato le dimensioni dei grafici quindi il pacchetto sceglie a piacere le unità di misura degli assi coordinati. Aggiungi [tt]scale mode=scale uniformly[/tt] a entrambi gli ambienti axis.
Problema 4: non usare [tt]\def[/tt] ma usa [tt]\newcommand[/tt] così se il nome del comando è già assegnato, te ne accorgi. Ci sono soluzioni alternative interne al pacchetto TikZ.
Ciao
-
5 Aprile 2014 alle 8:15 #93790::
Certo quello che ti ha detto @Liverpool è esatto, am ho guardato il tuo PDF e ho misurato le dimensioni della vista frontalee della vista superiore (non quella della vista laterale, che non c’è) e le dimensioni sono coerenti; quindi il disegno corrisponde a quel che hai scritto; ma se mancano le informazioni che ti ha indicato @Liverpool, certo non ottienei quello che ti saresti aspettato di ottenenere, ma quello che TikZ genera di default.
-
5 Aprile 2014 alle 18:14 #93791::
Grazie delle indicazioni. Ci ho provato ed ecco i risultati:Liverpool” post=93377non hai indicato le dimensioni dell’asse z
Se metto le stesse dimensioni degli assi x e y la figura risulta comunque schiacciata nella dimensione verticale (sul foglio/schermo). Per avere una figura che si avvicina a un cerchio devo andare per tentativi nell’assegnare [tt]zmin[/tt] e [tt]zmax[/tt] per la vista di fronte e nell’assegnare [tt]ymin[/tt] e [tt]ymax[/tt] per la vista in pianta.Mettendo questi valori =3.5 ottengo un risultato accettabile a occhio, ma non proprio preciso. Non c’è un modo meno empirico?
Liverpool” post=93377 Aggiungi [tt]scale mode=scale uniformly[/tt] a entrambi gli ambienti axis.
Se lo faccio mi da un errore “dimension too large” in compilazione.
Liverpool” post=93377
Problema 4: non usare [tt]\def[/tt] ma usa [tt]\newcommand[/tt] così se il nome del comando è già assegnato, te ne accorgi. Ci sono soluzioni alternative interne al pacchetto TikZ.Infatti e uso [tt]\newcommand[/tt] mi dice che è già assegnato, ma io vorrei poter riassegnare i valori in ogni ambiente [tt]tikzpicture[/tt] in modo da avere un codice flessibile che mi permetta di rappresentare anche oggetti diversi. Dove posso trovare delle indicazioni sugli altri modi cui accenni?
Non capisco l’osservazione di OldClaudio. In che senso le misure sono coerenti?
-
5 Aprile 2014 alle 21:17 #93792::
Nel senso che esse appaiono corrette, supponendo che il tuo ellissoide non sia di rotazione, cosa che non si può sapere da quelle due viste perché il tra alla vista frontale, e a quella superiore ci vuole quella laterale.
In sostanza la vista frontale ha una asse verticale piuttosto grande, e un asse orizzontale di 4cm; nella vista dall’alto si vede una ellisse con il reticolo delle coordinate, ma l’asse orizzontale è di 4cm; quindi è coerente con al vista frontale. L’asse verticale nella vista dall’alto è minore dell’asse orizzontale, ma non lo si può confrontare con nulla, perché manca la vista laterale.Allora se volevi fare un ellissoide ellittico, ci sei riuscito benissimo; se volevi fare un ellissoide di rotazione, evidentemente il risultato è sbagliato. Metti i valori minimi e massimi giusto sui tre assi e vedrai che ottieni il risultato che volevi. Il disegno verrebbe ancora meglio se tutte le linee coordinate di meridiani e paralleli sull’ellissoide fossero davvero continue, invece che spezzate in segmenti; si tratta in fondo di disegnare delle altre ellissi. ma ci vuole tempo e lascio a te il piacere di trovare come disegnare le ellissi giuste per rappresentare meridiani e paralleli.
-
6 Aprile 2014 alle 6:56 #93793::
Prova questo codice. Perché ho usato esplicitamente [tt]x[/tt], [tt]y[/tt] e [tt]z[/tt] al posto di [tt]view[/tt]? Semplicemente perché ho capito che vuoi che le dimensioni vengano rispettate e [tt]scale mode=none[/tt] mi dava stranamente un risultato sbagliato. Purtroppo ora non ho tempo di indagare; magari qualche altro utente risolverà il mistero.I comandi [tt]\coordinate[/tt] e [tt]\draw[/tt] servono solo per tracciare le linee di proiezione, ma se non ti servono, li puoi eliminare. Se anche la proiezione laterale non ti serve, cancella il secondo e il quarto ambiente [tt]\nextgroupplot[/tt] e cambia [tt]2 by 2[/tt] in [tt]1 by 2[/tt].
Ciao
`\documentclass[11pt]{article}
\usepackage[italian]{babel}
\usepackage{pgfplots} % pgfplots carica TikZ e xcolor
\pgfplotsset{compat=1.9} % carica le impostazioni più recenti di pgfplots
\usepgfplotslibrary{groupplots} % carica la libreria groupplots
\colorlet{lightblue}{blue!60}\begin{document}
%%%%%%%%%
\begin{figure} % sfera
\begin{tikzpicture}
\pgfmathsetmacro{\r}{2} % raggio della sfera
\newcommand{\disegnasfera}{ % comando che disegna la sfera
\addplot3 [surf, z buffer=sort, samples=21, variable = \u, variable y = \v,
domain = 0:180, y domain = 0:360, colormap name=gb, opacity = 0.5]
( {\r*sin(u)*cos(v)}, {\r*sin(u)*sin(v)}, {\r*cos(u)} );
}\pgfplotsset{every axis/.style={ % opzioni comuni a tutti i grafici
axis lines=none,
colormap={gb}{color(0cm)=(lightblue); color(1cm)=(white)}},
every axis title/.style={at={(0,1)}, below right, font=\footnotesize}
}\begin{groupplot} [group style={group size=2 by 2}] % prepara i 4 quadri
\nextgroupplot [x={(1cm,0)}, y={(0,0)}, z={(0,1cm)}, title=PV] % piano verticale
\coordinate (P1) at (axis cs:0,0,-2); % questi comandi servono solo per
\coordinate (P2) at (axis cs:0,0,2); % disegnare le linee delle proiezioni
\coordinate (P3) at (axis cs:-2,0,0);
\coordinate (P4) at (axis cs:2,0,0);
\disegnasfera
\nextgroupplot [x={(0,0)}, y={(1cm,0)}, z={(0,1cm)}, title=PL] % piano laterale
\coordinate (Q1) at (axis cs:0,0,-2);
\coordinate (Q2) at (axis cs:0,0,2);
\disegnasfera
\nextgroupplot [x={(1cm,0)}, y={(0,1cm)}, z={(0,0)}, title=PO] % piano orizzontale
\coordinate (Q3) at (axis cs:-2,0,0);
\coordinate (Q4) at (axis cs:2,0,0);
\disegnasfera
\nextgroupplot [group/empty plot]
\end{groupplot}
\foreach \i in {1,…,4}
\draw [dashed, gray] (P\i) — (Q\i);
\end{tikzpicture}\caption {…….}
\label{fig:1}
\end{figure}
\end{document}`
-
6 Aprile 2014 alle 17:57 #93794
-
6 Aprile 2014 alle 21:02 #93795
-
7 Aprile 2014 alle 11:23 #93796::
Puoi continuare ad usare [tt]view[/tt] al posto di [tt]x[/tt], [tt]y[/tt], [tt]z[/tt] se tra le opzioni degli assi aggiungi:
`width=4cm, height=4cm, scale only axis,
xmin=-2, xmax=2, ymin=-2, ymax=2, zmin=-2, zmax=2`
Chiaramente, dichiarare le unità di misura degli assi ti evita di dover valutare ogni volta gli estremi del disegno.
-
7 Aprile 2014 alle 18:10 #93797::
Grazie a tutti !
Adesso funziona con il codice suggerito da Liverpool. Ho solo cambiato la
\pgfplotsset{compat=1.9}
in
\pgfplotsset{compat=1.8}
perché la versione 1.9 mi dice che non c’è. Non so perché visto che mi sembra di aver fatto tutto quello suggerito da Old Claudio. ma comunque va bene.
-
7 Aprile 2014 alle 18:44 #93798::
Liverpool” post=93403Puoi continuare ad usare [tt]view[/tt] al posto di [tt]x[/tt], [tt]y[/tt], [tt]z[/tt] se tra le opzioni degli assi aggiungi:
….Ho provato con questo codice
`
\begin{document}
%%%%%%%%%
\begin {figure}[htbp] %sfera
%
\begin{tikzpicture}
% assi coordinate e vista
\begin{axis}
[
]width=4cm,
height=4cm,
scale only axis,
xmin=-2, xmax=2,
ymin=-2, ymax=2,
zmin=-2,zmax=2,
axis lines=none,
view={0}{0},%fronte
scale=1
]
%
%disegna sfera 1
\def \r{2}
%
\addplot3
[ opacity = 0.5,
surf,
z buffer = sort,
samples = 21,
variable = \u,
variable y = \v,
domain = 0:180,
y domain = 0:360,
colormap name=gb,
colormap={gb}{color(0cm)=(lightblue); color(1cm)=(white)} ]
%
( {\r*sin(u)*cos(v)},
{\r*sin(u)*sin(v)},
{\r*cos(u)} );
%
\end{axis}
\end{tikzpicture}
%
%
\begin{tikzpicture}
% assi coordinate e vista
\begin{axis}
[
]width=4cm,
height=4cm,
scale only axis,
xmin=-2, xmax=2,
ymin=-2, ymax=2,
zmin=-2,zmax=2,
axis lines=none,
view={0}{0},%fronte
scale=1
]
%
%disegna sfera 2
\def \r{2}
%
\addplot3
[ opacity = 0.5,
surf,
z buffer = sort,
samples = 21,
variable = \u,
variable y = \v,
domain = 0:180,
y domain = 0:360,
colormap name=gb,
colormap={gb}{color(0cm)=(lightblue); color(1cm)=(white)} ]
%
( {\r*sin(u)*cos(v) },
{\r*sin(u)*sin(v) },
{\r*cos(u)} );
%
\end{axis}
\end{tikzpicture}
%
%
\begin{tikzpicture}
% assi coordinate e vista
\begin{axis}
[
]width=4cm,
height=4cm,
scale only axis,
xmin=-2, xmax=2,
ymin=-2, ymax=2,
zmin=-2,zmax=2,
axis lines=none,
view={0}{0},%fronte
scale=1
]
%
%disegna sfera 3
\def \r{2}
%
\addplot3
[ opacity = 0.5,
surf,
z buffer = sort,
samples = 21,
variable = \u,
variable y = \v,
domain = 0:180,
y domain = 0:360,
colormap name=gb,
colormap={gb}{color(0cm)=(lightblue); color(1cm)=(white)} ]
%
( {\r*sin(u)*cos(v) },
{\r*sin(u)*sin(v) },
{\r*cos(u)} );
%
\end{axis}
\end{tikzpicture}
\caption {…….}
\label{fig:1}
\end{figure}
%%%%%%%%%
\end{document}
`
ma compaiono gli assi, che non dovrebbero esserci visto l’opzione axis line=none (o sbaglio?) e ancora le dimensioni sono schiacciate e per di più non sono le proiezioni che mi aspetto dalle opzioni wiew. (vedi allegato)
Attachments:
You must be logged in to view attached files. -
7 Aprile 2014 alle 19:25 #93799
-
8 Aprile 2014 alle 4:29 #93800::
eminova” post=93409Grazie a tutti !
Adesso funziona con il codice suggerito da Liverpool. Ho solo cambiato la
\pgfplotsset{compat=1.9}
in
\pgfplotsset{compat=1.8}
perché la versione 1.9 mi dice che non c’è. Non so perché visto che mi sembra di aver fatto tutto quello suggerito da Old Claudio. ma comunque va bene.Il che vuol dire che hai MacTeX, ma non aggiornato. La versione di pgfplots attuale è la 1.10. Ti basta cercare fra le applicazioni TeXLive Utility e aggiornare dall’apposito menù (in inglese Actions -> Update all Packages).
Ciao
Claudio
-
8 Aprile 2014 alle 5:10 #93801
-
8 Aprile 2014 alle 5:35 #93802::
eminova” post=93409Grazie a tutti !
Adesso funziona con il codice suggerito da Liverpool. Ho solo cambiato la
\pgfplotsset{compat=1.9}
in
\pgfplotsset{compat=1.8}
perché la versione 1.9 mi dice che non c’è. Non so perché visto che mi sembra di aver fatto tutto quello suggerito da Old Claudio. ma comunque va bene.La versione corrente del pacchetto TikZ/pgf della MacTeX 2013 aggiornata con TeXLive Utility.app è la 1.10. Pu`ø darsi che la 1.9 non sia mai stata distribuita, ma ne dubito. quell’impostazione [tt]\pgfplotsset{compat=1.9}[/tt] non presume l’esistenza sul disco di una versione 1.9, ma dice al pacchetto di usare una sintassi ora divenuta “obsoleta”, e da usarsi solo per motivi di compatibilità. Può benissimo darsi che nel creare la versione 1.10, non sia stata aggirnata quell’impostazione. ma come hai visto si tratta solo di un dettaglio quasi irrilevante scrivere 1.8 invece di i.9.
-
8 Aprile 2014 alle 5:56 #93803::
E va bene! 😳 Ho sbagliato: avrei dovuto scrivere [tt]compat=1.10[/tt] ma mi è proprio sfuggito di mente il numero dell’ultima versione. Sul manuale si legge che la 1.10 non differisce dalla 1.9 riguardo alla compatibilità e quindi scrivere [tt]compat=1.10[/tt] equivale a scrivere [tt]compat=1.9[/tt] (il numero è stato aggiornato solo perché la versione del pacchetto è stata aggiornata). In ogni caso a @eminova serve una versione non anteriore alla 1.6 per risolvere uno dei problemi nascosti nel suo codice originario, motivo per cui la riga sulla compatibilità diventa necessaria (perché altrimenti il default è [tt]pre 1.3[/tt]), ma anche [tt]compat=1.8[/tt] va bene.A parte questo, consiglio anch’io di aggiornare la distribuzione, perché oltre a pgfplots potrebbero esserci altri pacchetti non aggiornati.
Ciao
-
8 Aprile 2014 alle 9:15 #93804::
OldClaudio” post=93421La versione corrente del pacchetto TikZ/pgf della MacTeX 2013 aggiornata con TeXLive Utility.app è la 1.10. Pu`ø darsi che la 1.9 non sia mai stata distribuita, ma ne dubito. quell’impostazione [tt]\pgfplotsset{compat=1.9}[/tt] non presume l’esistenza sul disco di una versione 1.9, ma dice al pacchetto di usare una sintassi ora divenuta “obsoleta”, e da usarsi solo per motivi di compatibilità. Può benissimo darsi che nel creare la versione 1.10, non sia stata aggirnata quell’impostazione. ma come hai visto si tratta solo di un dettaglio quasi irrilevante scrivere 1.8 invece di i.9.
Liverpool” post=93422E va bene! 😳 Ho sbagliato: avrei dovuto scrivere [tt]compat=1.10[/tt] ma mi è proprio sfuggito di mente il numero dell’ultima versione. Sul manuale si legge che la 1.10 non differisce dalla 1.9 riguardo alla compatibilità e quindi scrivere [tt]compat=1.10[/tt] equivale a scrivere [tt]compat=1.9[/tt] (il numero è stato aggiornato solo perché la versione del pacchetto è stata aggiornata). In ogni caso a @eminova serve una versione non anteriore alla 1.6 per risolvere uno dei problemi nascosti nel suo codice originario, motivo per cui la riga sulla compatibilità diventa necessaria (perché altrimenti il default è [tt]pre 1.3[/tt]), ma anche [tt]compat=1.8[/tt] va bene.
A parte questo, consiglio anch’io di aggiornare la distribuzione, perché oltre a pgfplots potrebbero esserci altri pacchetti non aggiornati.
Solo una precisazione: TikZ/pgf è attualmente alla versione 3.0.0 e pgfplots alla 1.10. Viaggiano separatamente, per quello hanno versioni distinte. Pgfplots introduce l’opzione compat con cui si indica a quale versione il documento sarà compatibile. Quindi si può lavorare anche con versioni vecchie, accettandone le limitazioni. Come diceva implicitamente @Liverpool, è bene prendere l’abitudine di indicare sempre con quale versione si lavora altrimenti il default è una versione vecchia di qualche anno. Fra la 1.8 e la 1.10 probabilmente saranno cambiate pochissime cose, ma non è così per versioni più vecchie: in particolare, mi ricordo che ci sono grossi passi in avanti in ogni versione fra la 1.3 e la 1.7.
In sostanza, aggiornare e avere pgfplots aggiornato permette di poter lavorare con “tutte” le sue versioni più recenti specificando a quale il documento sarà compatibile. Se si ha un errore di compatibilità, in genere è solo per mancanza dell’ultima (o penultima come in questo caso) versione. Il che non vuol dire che il documento non possa compilare: basta rendere il documento compatibile con una versione precedente. Ovviamente a patto di non utilizzare opzioni introdotte solo dall’ultima versione. Ma nel 90% delle volte per un uso “normale” funziona.
Ciao
Claudio
-
-
AutoreRisposte
- Devi essere connesso per rispondere a questo topic.