Tikz stacked ybar

Tabellen und Grafiken erstellen und anordnen


mar.kus
Forum-Anfänger
Forum-Anfänger
Beiträge: 18
Registriert: Di 16. Nov 2010, 12:03

Tikz stacked ybar

Beitrag von mar.kus »

Hallo,

ich versuche ein Diagramm zu erstellen, was wie ein Box-Plot ohne Whiskers aussieht. Dabei sollen die einzelnen Säulen (jeweils 2) dicht aneinander gezeichnet werden.

Habe noch ein paar Probleme zu lösen und finde selbst keine Antwort. Meine Fragen:

1. Wie gruppiere ich die Säulen?
2. Wie kann ich das Label mittig zwischen den beiden Säulen ausrichten
3. Wie schalte ich die die Farbe einer Säule auf transparent? Es gibt Probleme bei den Achsen und auch bei dem Grid
4. Wie kann ich am besten einen Mittelwert kennzeichnen? Eine Linie die genau so lang wie die Säulen breit sind?

5. (nicht ganz passend zu dem Diagramm) Wie kann ich den Befehl \diag{} verändern um das speichern der externen Grafik zu verhindern? Ich muss jedesmal die entsprechende pdf löschen und danach erstellt LaTeX erst die Grafik neu.

Main:
\documentclass[ngerman]{article}
\usepackage[T1]{fontenc}% fontenc und inputenc erm�glichen
\usepackage[utf8]{inputenc}% Silbentrennung und

\usepackage{babel}    % Babel f�r diverse Sprachanpassungen

%Grafiken
\usepackage{pgfplots}
\usepackage{pgfplotstable}

%\usepackage{filecontents}
%\usepackage{pstricks}
%\usepackage{pst-plot}
\usetikzlibrary{external}
\tikzexternalize[prefix=tikz/]
\usepgfplotslibrary{units}


\newlength\figureheight 		% define length \figureheight
\newlength\figurewidth 			% define length \figurewidth

\newcommand{\diag}[7]{
\tikzexternalenable
\begin{figure}[!htb]
	\centering
	\setlength\figureheight{#7\linewidth} 	% set \figureheight
	\setlength\figurewidth{#6\linewidth}		% set \figurewidth
	\tikzsetnextfilename{#5}	% name next TikZ figure
%	\pgfplotstableread[col sep=semicolon]{data/#2}\Data
	
	\pgfplotsset{	compat=newest,
				every axis plot post/.append style={line width = 2pt},
				every tick/.style={very thin,gray},
				every tick label/.style={font={\scriptsize}},
				every axis label/.style={font={\small}},
				every axis/.append style={legend style={font=\tiny,line width=1pt,mark size=10pt}}
				}
	\input{#1}			% input TiKZ figure code
	\caption{#3}	% caption
	\label{fig:#4}				% label
\end{figure}
\tikzexternaldisable
}

\begin{document}
\diag{stackedybarplot}{}{stacked ybar plot}{stacked}{stacked}{1}{0.4}
\end{document}

Diagramm:
\pgfplotstableread{
X  	min		max		mean		label
1  	0.4		1.2		1.0		RCP2.6
3 	0.9		1.1		1.4		RCP4.5
5	0.8		1.0		1.3		RCP6.0
7	1.4		1.2		2.0		RCP8.5

}\data

\pgfplotstableread{
X  	min		max		mean		label
2  	0.3		1.4		1.0		RCP2.6
4 	1.1		1.5		1.8		RCP4.5
6	1.4		1.7		2.2		RCP6.0
8	2.6		2.2		3.7		RCP8.5
}\datab

\begin{tikzpicture}

\begin{axis}[
	ybar stacked,
	ymin=0,
	set layers,
	bar width=12pt,
	xtick=data,
	xticklabels from table={\data}{label},
	height=\figureheight,
	width=\figurewidth, 
	xlabel=Emissioinsszenario,
	ylabel=Temperaturänderung, 
	use units,
	legend style={at={(0.5,-0.2)}, anchor=north, legend columns=-1},
	xticklabel style={rotate=90,xshift=-2ex,anchor=mid east},
	y unit=K,
	ymajorgrids,
	axis lines*=left
	]


\addplot [color=blue!0, fill=blue!0] table [y=min,x=X] \data;
\addplot +[color=gray!60] table [y=max,x=X] \data;

\addplot +[color=blue!0, fill=blue!0] table [y=min,x=X] \datab;
\addplot +[color=gray!90] table [y=max,x=X] \datab;



\end{axis}
\end{tikzpicture}


esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Deiner 5.Frage entnehme ich, dass du den Code von einer anderen Stelle übernommen hast?

Vielleicht wäre es auch einfacher, zunächst erstmal ein einzelnes Diagramm in der gewünschten Form zu erstellen, bevor dafür ein eigener Befehl definiert wird?

Die Werte die bei X stehen, geben vor, wo die Balken gezeichnet werden. Wenn die erste Messreihe bei den X-Werten 1, 3, 5 und 7 und die andere bei den geraden Werte dazwischen zeichnen lässt, dann haben die Balken alle den Abstand 1 und sind nicht gruppiert. Mit der Opiton 'bar shift=...' kannst du sie aber so verschieben, dass es passt.

Hier ist jedenfalls mal ein Vorschlag, der vielleicht als Ausgangspunkt weiter hilft:
\documentclass{article} 
\usepackage[utf8]{inputenc}
\usepackage{pgfplots} 
\pgfplotsset{compat=1.9}
\usepackage{pgfplotstable} 

\begin{document} 

\pgfplotsset{
    every tick/.style={very thin,gray}, 
    every tick label/.style={font={\scriptsize}}, 
    every axis label/.style={font={\small}}, 
    every axis/.append style={legend style={font=\tiny,line width=1pt,mark size=10pt}} 
    } 
\pgfplotstableread{ 
 X     min      max      mean      label 
 1     0.4      1.2      1.0      RCP2.6 
 3    0.9      1.1      1.4      RCP4.5 
 5   0.8      1.0      1.3      RCP6.0 
 7   1.4      1.2      2.0      RCP8.5 
}\data 

\pgfplotstableread{ 
 X     min      max      mean      label 
 2     0.3      1.4      1.0      RCP2.6 
 4    1.1      1.5      1.8      RCP4.5 
 6   1.4      1.7      2.2      RCP6.0 
 8   2.6      2.2      3.7      RCP8.5 
}\datab 

\begin{tikzpicture}

\pgfplotsset{ybar stacked,
    ymin=0,ymax=5,xmin=0, xmax=9,
    height=0.4\linewidth,width=\linewidth}

\begin{axis}[bar width=12pt,
    xtick=data, 
    xticklabels from table={\data}{label},
    xticklabel style={rotate=90,xshift=-1ex,anchor=mid east},
    xlabel=Emissioinsszenario, 
    ylabel={Temperaturänderung [K]}, 
    ymajorgrids, 
    axis lines*=left,
    bar shift=-0.3
    ] 
  \addplot+ [color=blue!50,opacity=0.4] table [y=min,x=X] \data; 
  \addplot+ [color=gray!60,opacity=0.4] table [y=max,x=X] \data; 
\end{axis}

\begin{axis}[bar width=12pt,
    axis lines=none,
    bar shift=-0.7
     ]
  \addplot+ [color=blue,opacity=0.5] table [y=min,x=X] \datab; 
  \addplot+ [color=gray!90,opacity=0.5] table [y=max,x=X] \datab;
\end{axis}

\end{tikzpicture} 

\end{document} 
Gruß
Elke
Zuletzt geändert von esdd am Do 17. Okt 2013, 10:38, insgesamt 1-mal geändert.

mar.kus
Forum-Anfänger
Forum-Anfänger
Beiträge: 18
Registriert: Di 16. Nov 2010, 12:03

Beitrag von mar.kus »

Danke, so gefällt mir es schon besser. Nur passen die Werte der 2. Datenreihe nicht. Die Höhe der Balken ist falsch. Liegt das an der Trennung der Ausgangsdaten in zwei Felder?

Die Definitioin des Befehles habe ich mir selbst zusammen gebaut. Ich würde nur gern eine Option integrieren, die mir das lästige Löschen spart.

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Nein, es fehlte die Angabe von ymax. Die habe ich oben ergänzt.

Aber bist du dir sicher, dass du wirklich stacked ybar plots haben möchtest? Dabei wird der eine Balken auf den anderen drauf gesetzt, d.h. die Gesamthöhe des Balkens entspricht der Summe aus min und max.

Gruß
Elke
Zuletzt geändert von esdd am Do 17. Okt 2013, 11:00, insgesamt 1-mal geändert.

mar.kus
Forum-Anfänger
Forum-Anfänger
Beiträge: 18
Registriert: Di 16. Nov 2010, 12:03

Beitrag von mar.kus »

mar.kus hat geschrieben:Danke, so gefällt mir es schon besser. Nur passen die Werte der 2. Datenreihe nicht. Die Höhe der Balken ist falsch. Liegt das an der Trennung der Ausgangsdaten in zwei Felder?

Fehler gefunden, bei beiden Achsdefinitionen müssen die y-Grenzen angegeben werden

mar.kus
Forum-Anfänger
Forum-Anfänger
Beiträge: 18
Registriert: Di 16. Nov 2010, 12:03

Beitrag von mar.kus »

und wie bekomme ich die Legende so hin, dass jeweils nur die oberen Balken mit Farbe und Text darin stehen?

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Hast du meine Frage gesehen: Soll die Gesamthöhe der Balken tatsächlich jeweils der Summe von min und max entsprechen?

mar.kus
Forum-Anfänger
Forum-Anfänger
Beiträge: 18
Registriert: Di 16. Nov 2010, 12:03

Beitrag von mar.kus »

Ich habe das Diagramm erneuert. Der erste Balken wird ausgeblendet und nur der obere Balken bleibt stehen. Der Compiler gibt mir noch einen Fehler aus, vielleicht findest du ihn.

Eine weitere Frage zum Verständnis. Warum ist das + nach \addplot ?
\pgfplotstableread{
X  	min		max		mean		label
1  	0.4		1.2		1.0		RCP2.6
3 	0.9		1.1		1.4		RCP4.5
5	0.8		1.0		1.3		RCP6.0
7	1.4		1.2		2.0		RCP8.5

}\mitte

\pgfplotstableread{
X  	min		max		mean		label
1 	0.3		1.4		1.0		RCP2.6
3	1.1		1.5		1.8		RCP4.5
5	1.4		1.7		2.2		RCP6.0
7	2.6		2.2		3.7		RCP8.5
}\ende

\begin{tikzpicture}
\pgfplotsset{ybar stacked, 
    		ymin=0,xmin=0, xmax=8, 
	    	height=\figureheight,
	    	width=\figurewidth} 


\begin{axis}[bar width=15pt, 
    xtick=data, 
    xticklabels from table={\mitte}{label}, 
    xticklabel style={rotate=90,xshift=-0.8ex,anchor=mid east}, 
    xlabel=Emissioinsszenario, 
    ylabel={Temperaturänderung [K]}, 
    ymajorgrids, 
    ymin=0, ymax=5, 
    axis lines*=left, 
    bar shift=-12pt
    ] 
  \addplot+ [color=blue!50,opacity=0] table [y=min,x=X] \mitte; 
  \addplot+ [color=gray!70,opacity=0.8] table [y=max,x=X] \mitte; 
\end{axis} 

\begin{axis}[bar width=15pt, 
	ymin=0, ymax=5, 
    	axis lines=none, 
   	bar shift=12pt
     ] 
  \addplot+ [color=blue,opacity=0] table [y=min,x=X] \ende; 
  \addplot+ [color=gray!90,opacity=0.9] table [x=X, y=max] \ende; 
\end{axis} 
\end{tikzpicture}

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

In der Fehlermeldung steht, dass er mit \figureheight und \figurewidth nichts anfangen kann. Entweder du gibst sinnvolle Werte für height und width vor oder du lässt beide Optionen weg.

Die Angabe von ymin und ymax würde ich nicht bei den einzelnen axis-Umgebungen machen, sondern in dem pgfplotsset für das tikzpicture, damit die Werte ganz sicher für alle axis Umgebungen einheitlich sind.
\begin{tikzpicture} 
\pgfplotsset{ybar stacked, 
           ymin=0,ymax=5,xmin=0, xmax=8, 
           %height=0.5\linewidth, 
           %width=\linewidth
          } 
...
Die Erklärung zu \addplot+ findet sich in der Doku zu pgfplots:
\addplot+[<options>] ...;
Does the same like \addplot[<Options>] ...; except that <options> are appended to the arguments
which would have been taken for \addplot ... (the element of the default list).
Um bei jedem Durchlauf die Zeichnungen zu neu zu externalisieren, kannst du bei \tikzexternalize die Option 'force remake' ergänzen. Näheres findest du im pgfmanual im Kapitel zur „Externalization Library“.

mar.kus
Forum-Anfänger
Forum-Anfänger
Beiträge: 18
Registriert: Di 16. Nov 2010, 12:03

Beitrag von mar.kus »

Das Diagramm steht so weit, jedoch fehlt noch die Legende. Wie kann ich die manuell hinzufügen?

Antworten