Säulendiagramm mit pgfplots

Tabellen und Grafiken erstellen und anordnen


c.webi
Forum-Newbie
Forum-Newbie
Beiträge: 2
Registriert: So 13. Okt 2013, 17:12

Säulendiagramm mit pgfplots

Beitrag von c.webi »

Hallo!

Ich schreibe zur Zeit meine Diplomarbeit mit Latex und muss dabei einige Diagramme einfügen. Bisher habe ich einfach die Excel-Diagramme als Vektorgrafiken exportiert und eingefügt. Ich würde diese aber gern direkt im Latex via pgfplots erstellen. Ich habe mich jetzt schon ziemlich lange damit beschäftigt, kann aber leider ein paar Probleme einfach nicht lösen.
Mein Diagramm sieht mittlerweile folgendermaßen aus:
\documentclass[a4paper,11pt]{article}

\usepackage{fullpage}
\usepackage[latin1]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepackage{tikz}

\pgfplotsset{compat=1.5.1}

\makeatletter
\pgfplotsset{
    centered nodes near coords/.style={
    calculate offset/.code={
        \pgfkeys{/pgf/fpu=true,/pgf/fpu/output format=fixed}
        \pgfmathsetmacro\testmacro{(\pgfplotspointmeta*10^\pgfplots@data@scale@trafo@EXPONENT@y)/2*\pgfplots@y@veclength)}
        \pgfkeys{/pgf/fpu=false}
    },
    every node near coord/.style={
        /pgfplots/calculate offset,
        yshift=-\testmacro,
        black,
    }
		,
    nodes near coords align=center,
yticklabel=\pgfmathprintnumber{\tick}\,\%,
ymin=0,
ymax=100
    }}
\makeatother


\begin{document}


%Wertetabelle (Absolut)
%First Second Third Fourth
%174	62	0	12
%165	80	0	3
%69	159	2	18
%19	185	5	39
%39	86	4	119
%56	98	4	90


\begin{tikzpicture}

\pgfplotstableread{

First Second Third Fourth
70.2	25.0	0.0	4.8
66.5	32.3	0.0	1.2
27.8	64.1	0.8	7.3
7.7	74.6	2.0	15.7
15.7	34.7	1.6	48.0
22.6	39.5	1.6	36.3

}\datarelative


\begin{axis}
[ybar stacked,
bar width=1.5cm, width=15cm,
centered nodes near coords,
point meta=rawy,
enlarge x limits=auto,
xtick=data,
xticklabels={
       Kategorie 1,
        Kategorie 2,
        Kategorie 3,
        Kategorie 4,
        Kategorie 5,
        Kategorie 6
    },
xticklabel style={font=\footnotesize, text width=2cm, align=center, rotate=45}
]

\addplot  +[
ybar stacked,
nodes near coords
] table 
[y=First, x expr=\coordindex] {\datarelative};
\addplot +[
ybar stacked,
nodes near coords
] table [y=Second, x expr=\coordindex] {\datarelative};
\addplot +[
ybar stacked,
nodes near coords
] table [y=Third, x expr=\coordindex] {\datarelative};
\addplot +[
ybar stacked,
nodes near coords
] table [y=Fourth, x expr=\coordindex] {\datarelative};
\end{axis}
\end{tikzpicture}


\end{document}
[\code]

Ich bin damit eigentlich auch schon weitgehen zufrieden. Es gibt aber noch 2 Dinge die ich ändern will/muss:

1) Die Werte der Säulenabschnitte, sollten nicht als Prozent sondern als absolute Zahlen angegeben werden (Die Tabelle mit den absoluten Zahlen ist in meinem Code enthalten.

2) Jene Werte die gleich 0 sind, sollen nicht angezeigt werden.


Ich hoffe ihr könnt mir dabei helfen!

Thx a lot.. :D

feuersaenger
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 91
Registriert: Mi 5. Okt 2011, 18:24
Wohnort: Rheinbach

Beitrag von feuersaenger »

Hi,

in Deinem Fall lohnt sich der upgrade von pgfplots auf die neueste stable version 1.9 : die hat naemlich native unterstuetzung fuer stacked plots und nodes near coords. Zudem unterstuetzt die das Nicht-darstellen von "0" inkrements von Haus aus.

Deine Anforderung mit den absolutwerten erfordert einen lookup in Deiner absolutwerts tabelle, und zwar mithilfe des \coordindex aus der relativtabelle und dem richtigen Spaltennamen.

Sowas kann man mit \pgfplotstablegetelem{ row }{ col }\of table machen. Dummerweise braucht man 'visualization depends on', um den richtigen \coordindex zu verwenden - leider habe ich wohl beim implementieren des "unterdrueck 0-increments" einen Fehler beim erhoehen des \coordindex gemacht.

Hier waere der code:
\documentclass[a4paper,11pt]{article}

\usepackage[latin1]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepackage{tikz}

\pgfplotsset{compat=1.9}

\begin{document}


\begin{tikzpicture}
\pgfplotstableread{
First Second Third Fourth
174 62 0 12
165 80 0 3
69 159 2 18
19 185 5 39
39 86 4 119
56 98 4 90
}\dataabsolute


\pgfplotstableread{

First Second Third Fourth
70.2 25.0 0.0 4.8
66.5 32.3 0.0 1.2
27.8 64.1 0.8 7.3
7.7 74.6 2.0 15.7
15.7 34.7 1.6 48.0
22.6 39.5 1.6 36.3

}\datarelative


\begin{axis}
[ybar stacked,
bar width=1.5cm, width=15cm,
point meta=rawy,
enlarge x limits=auto,
xtick=data,
xticklabels={
Kategorie 1,
Kategorie 2,
Kategorie 3,
Kategorie 4,
Kategorie 5,
Kategorie 6
},
xticklabel style={font=\footnotesize, text width=2cm, align=center, rotate=45},
visualization depends on=value\coordindex \as\INDEX,
absolute values/.style={
	nodes near coords={\pgfplotstablegetelem{\INDEX}{#1}\of\dataabsolute\pgfmathprintnumber\pgfplotsretval},
},
]

\addplot +[
ybar stacked,
absolute values=First,
] table
[y=First, x expr=\coordindex] {\datarelative};
\addplot +[
ybar stacked,
absolute values=Second,
] table [y=Second, x expr=\coordindex] {\datarelative};
\addplot +[
ybar stacked,
absolute values=Third,
] table [y=Third, x expr=\coordindex] {\datarelative};
\addplot +[
ybar stacked,
absolute values=Fourth,
] table [y=Fourth, x expr=\coordindex] {\datarelative};
\end{axis}
\end{tikzpicture}


\end{document} 
Ich habe einen style 'absolute values' gemacht, der als erstes Argument den spaltennamen fuer \dataabsolute' braucht.

Den overhead mit 'visualization depends on' und \pgfplotstablegetelem' koenntest Du Dir sparen, wenn Du den absolutwert direkt in die eingabetabelle als extra-spalten mitreinschreibst -aber das ist optional.

Mit liebem Gruss

Christian

c.webi
Forum-Newbie
Forum-Newbie
Beiträge: 2
Registriert: So 13. Okt 2013, 17:12

Beitrag von c.webi »

Vielen vielen Dank! Das hat mir extrem weiter geholfen.


Das ist genau das, was ich wollte :D

Antworten