Forum GuIT

Transcript

Forum GuIT
Forum GuIT - GuIT
Generato il: 16 March, 2017, 08:02
[Risolto] "Marcatura" dei grafici a barre con pgfplots
Inviato da Matteo Colombo - 09/12/2012 15:32
_____________________________________
Ciao a tutti!
Ho prodotto diversi grafici a barre con pgfplots per la tesi, e adesso dovrei marcare le singole barre con
un simbolino in cima per indicare la significatività statistica di ciascuna (riportata poi in caption): così su
una barra ci sarà un *, su un'altra un #, su un'altra ancora un § e così via.
Le opzioni nodes near coords e point meta=explicit symbolic permettono questo, specificando poi il
simbolo fra parentesi quadre alla coordinata desiderata.
Peccato che il simbolo viene prodotto ad una distanza fissa dal bordo superiore della barra; e questo è
un problema grosso perchè le barre hanno la deviazione standard, e finisce che simbolo e deviazione
standard collidono.
L'esempio minimo spiegherà meglio:
[code]
documentclass[10pt, a4paper, twoside,openright, BCOR5mm]{scrbook}
usepackage{etex}
usepackage[T1]{fontenc}
usepackage[utf8]{inputenc}
usepackage[italian]{babel}
usepackage{mparhack}
usepackage[eulermath]{classicthesis}
usepackage{arsclassica}
usepackage{pgfplots}
1/8
Forum GuIT - GuIT
Generato il: 16 March, 2017, 08:02
pgfplotsset{/pgf/number format/use comma, compat=newest}
usepackage{siunitx}
begin{document}
begin{figure}[htbp]
centering
begin{tikzpicture}
begin{axis}[
%enlarge x limits=0.40,
legend style={at={(0.5,-0.12)}, anchor=north,legend columns=-1},
%width=0.75textwidth,
bar width=24,
ybar,
ymin=0, ymax=10,
minor y tick num=3,
xtick=data,
ymajorgrids=true,
ylabel={Area (si{squaremicrometer})},
xtick pos=left,
symbolic x coords={NUCLEO},
]
2/8
Forum GuIT - GuIT
Generato il: 16 March, 2017, 08:02
addplot+[nodes near coords, point meta=explicit symbolic,
nodes near coords align={anchor= south},
error bars/.cd, y dir=both, y explicit]
coordinates{
(NUCLEO, 7.17) +- (0.26, 0.26) [§]
};
addplot+[nodes near coords, point meta=explicit symbolic, error bars/.cd, y dir=both, y explicit]
coordinates{
(NUCLEO, 7.5) +- (0.36, 0.36) [#]
};
legend{CTRL, BTZ, FU}
end{axis}
end{tikzpicture}
caption{§:~$p
============================================================================
Re: "Marcatura" dei grafici a barre con pgfplots
Inviato da robitex - 09/12/2012 18:27
_____________________________________
Ciao.
Non puoi semplicemente usare comandi draw con il sistema di coordinate axis cs?
Un saluto.
R.
============================================================================
Re: "Marcatura" dei grafici a barre con pgfplots
Inviato da Liverpool - 09/12/2012 18:29
_____________________________________
3/8
Forum GuIT - GuIT
Generato il: 16 March, 2017, 08:02
Seguendo la strada delle annotazioni personalizzate, potresti fare una cosa del genere:
documentclass{standalone}
usepackage{pgfplots}
usetikzlibrary{calc}
pgfplotsset{/pgf/number format/use comma, compat=newest}
usepackage{siunitx}
begin{document}
begin{tikzpicture}
begin{axis}[
%enlarge x limits=0.40,
legend style={at={(0.5,-0.12)}, anchor=north,legend columns=-1},
%width=0.75textwidth,
bar width=24pt,
ybar,
ymin=0, ymax=10,
minor y tick num=3,
ymajorgrids=true,
ylabel={Area (si{squaremicrometer})},
xtick pos=left,
xtick={1}, xticklabel={NUCLEO},
]
addplot+ [error bars/.cd, y dir=both, y explicit]
coordinates{(1, 7.17) +- (0.26, 0.26)};
draw ($(axis cs:1,7.43) + (-13pt,0)$) node [blue, anchor=south] {S};
addplot+ [error bars/.cd, y dir=both, y explicit]
coordinates{(1, 7.5) +- (0.36, 0.36)};
draw ($(axis cs:1,7.86) + (13pt,0)$) node [red, anchor=south] {#};
legend{CTRL, BTZ}
end{axis}
end{tikzpicture}
end{document}
13pt sono la somma di mezza larghezza delle barre (24 pt) + mezzo bar shift (2 pt). Nota come ho
dovuto trattare la tacchetta sull'asse orizzontale diversamente da te.
Indicati con (x) l'ascissa comune alle barre, con (w) la larghezza delle barre, con (d) lo scostamento tra
barre adiacenti, con (n) il numero di barre con la stessa tacca e con (i) la i-esima barra a partire dalla più
a sinistra, la formula generale per trovare l'ascissa delle etichette è
[x-frac{n-1}{2}(w+d)+(i-1)(w+d)=x+left(i-frac{n+1}{2}right)(w+d);,quad i=1,ldots,n]
Il secondo addendo corrisponde a -13pt e 13pt nel mio codice.
Ciao
4/8
Forum GuIT - GuIT
Generato il: 16 March, 2017, 08:02
============================================================================
Re: "Marcatura" dei grafici a barre con pgfplots
Inviato da Matteo Colombo - 09/13/2012 11:47
_____________________________________
robitex ha scritto:
Ciao.
Non puoi semplicemente usare comandi draw con il sistema di coordinate axis cs?
Un saluto.
R.
Infatti è quello che proponeva, più o meno, il paragrafo sulle Custom Annotations; il problema è che l'ho
trovato spiegato veramente male e sopratutto con pochi esempi (invece mi sembra una funzione molto
utile), e i comandi di Tikz non li so proprio usare.
Il suo manuale poi mi scoraggia: infatti ho cercato lì qualche info su draw, ma non ci ho cavato un ragno
dal buco.Se non era per l'articolo di Lorenzo e Tommaso poi non mi sarei mai sognato di crearmi i
grafici, ma li avrei senz'altro importati.
Con la conoscenza empirica dell'esempio di Liverpool magari ci capirò di più.
============================================================================
Re: "Marcatura" dei grafici a barre con pgfplots
Inviato da Liverpool - 09/13/2012 11:53
_____________________________________
Non ti scoraggiare! Ti allego anche un esempio di automazione che può essere migliorato. In particolare,
i colori vanno inseriti manualmente (non ho capito come recuperarli automaticamente dalla lista di
pgfplots). Se usi la mappa dei colori predefinita, l'ordine lo trovi sul manuale nel codice all'inizio di pag.
144. Inoltre non riesco ad usare alcuni caratteri speciali come etichette (ad esempio §). Qui qualcun altro
ci potrà aiutare
Ricordati di aggiornare il valore di n in defn{3} se cambi il numero di barre.
documentclass{standalone}
5/8
Forum GuIT - GuIT
Generato il: 16 March, 2017, 08:02
usepackage{pgfplots}
usetikzlibrary{calc}
pgfplotsset{/pgf/number format/use comma, compat=newest}
usepackage{siunitx}
begin{document}
begin{tikzpicture}
defx{1}
defn{3}
defw{24pt}
defd{2pt}
begin{axis}[ymin=0, ymax=10, bar width=w, ybar=d, xtick={x}, xticklabel={NUCLEO}, xtick pos=left,
ymajorgrids=true, minor y tick num=3, ylabel={Area (si{squaremicrometer})},
legend style={at={(0.5,-0.12)}, anchor=north,legend columns=-1}]
foreach [count=i] y/e/tx/colore in {7.17/0.26/%/blue, 7.5/0.36/#/red, 4/1/a/brown!60!black}
{
addplot+ [error bars/.cd, y dir=both, y explicit]
coordinates {(x,y) +- (e,e)};
pgfmathparse{y+e}
letzpgfmathresult
edeftemp
{noexpanddraw ($(axis cs:x,z) + {i-0.5*n-0.5}*(w+d,0)$) node [colore, anchor=south] {tx};}
temp
}
legend{CTRL, BTZ, booh?}
end{axis}
end{tikzpicture}
end{document}
Ciao
P.S: Ho dimenticato di dirti che ogni elemento separato da virgola del foreach dichiara una
ordinata/relativo errore/relativa etichetta/relativo colore.
============================================================================
Re: "Marcatura" dei grafici a barre con pgfplots
Inviato da Matteo Colombo - 09/13/2012 12:28
_____________________________________
Liverpool ha scritto:
Seguendo la strada delle annotazioni personalizzate, potresti fare una cosa del genere:
begin{document}
begin{tikzpicture}
begin{axis}[
%enlarge x limits=0.40,
6/8
Forum GuIT - GuIT
Generato il: 16 March, 2017, 08:02
legend style={at={(0.5,-0.12)}, anchor=north,legend columns=-1},
%width=0.75textwidth,
bar width=24pt,
ybar,
ymin=0, ymax=10,
minor y tick num=3,
ymajorgrids=true,
ylabel={Area (si{squaremicrometer})},
xtick pos=left,
xtick={1}, xticklabel={NUCLEO},
]
addplot+ [error bars/.cd, y dir=both, y explicit]
coordinates{(1, 7.17) +- (0.26, 0.26)};
draw ($(axis cs:1,7.45) + (-13pt,0)$) node [blue, anchor=south] {S};
addplot+ [error bars/.cd, y dir=both, y explicit]
coordinates{(1, 7.5) +- (0.36, 0.36)};
draw ($(axis cs:1,7.88) + (13pt,0)$) node [red, anchor=south] {#};
legend{CTRL, BTZ}
end{axis}
end{tikzpicture}
end{document}
13pt sono la somma di mezza larghezza delle barre (24 pt) + mezzo bar shift (2 pt). Nota come ho
dovuto trattare la tacchetta sull'asse orizzontale diversamente da te.
Indicati con (x) l'ascissa comune alle barre, con (w) la larghezza delle barre, con (d) lo scostamento tra
barre adiacenti, con (n) il numero di barre con la stessa tacca e con (i) la i-esima barra a partire dalla più
a sinistra, la formula generale per trovare l'ascissa delle etichette è
[x-frac{n-1}{2}(w+d)+(i-1)(w+d)=x+left(i-frac{n+1}{2}right)(w+d);,quad i=1,ldots,n]
Il secondo addendo corrisponde a -13pt e 13pt nel mio codice.
Ciao
Grazie Liverpool, il tuo codice funziona a meraviglia; l'unico inconveniente, richiedeva la libreria
usetikzlibrary{calc}, ma me l'ha segnalato l'editor.
============================================================================
Re: "Marcatura" dei grafici a barre con pgfplots
Inviato da Liverpool - 09/13/2012 12:37
_____________________________________
Matteo Colombo ha scritto:
7/8
Forum GuIT - GuIT
Generato il: 16 March, 2017, 08:02
Grazie Liverpool, il tuo codice funziona a meraviglia; l'unico inconveniente, richiedeva la libreria
usetikzlibrary{calc}, ma me l'ha segnalato l'editor.
Prego. Hai ragione: non so perché nel copia-incolla era saltato il preambolo. Ora l'ho corretto a beneficio
degli altri utenti.
Ciao
============================================================================
8/8