pgfplots Säulendiagramm: Kordinaten Filter, x ticklabels

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smilies
:D :) :( :o :shock: :? 8) :lol: :-x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Wenn du eine Datei oder mehrere Dateien anhängen möchtest, gib die Details unten ein.

Ansicht erweitern Die letzten Beiträge des Themas: pgfplots Säulendiagramm: Kordinaten Filter, x ticklabels

von monchi » Di 6. Okt 2015, 22:32

Ich hab das Minimalbeispiel nochmal abgeändert, da ich die Daten anhand von zwei Spalten gleichzeitig Filtern muss.



Die x tick labels kann ich auch manuell hinzufügen das ist kein Problem. Bei dem zweiten Minimalbeispiel sind jetzt sowohl die Balken des zweiten Plots als auch die Beschriftung der x-Achse völlig verschoben. Hat jemand eine Idee woran das liegen könnte?
\documentclass[]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{ngerman}
\usepackage{graphicx}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepackage{tikz}
\usepackage{filecontents}

\pgfplotsset{compat=newest,compat/show suggested version=false}

\pgfplotsset{
 	discard if/.style 2 args={
 		x filter/.code={
 			\edef\tempa{\thisrow{#1}}
 			\edef\tempb{#2}
 			\ifx\tempa\tempb
 			\def\pgfmathresult{inf}
 			\fi
 		}
 	},	
 	discard if not two/.style n args={4}{
 		x filter/.code={
 			\edef\tempa{\thisrow{#1}}
 			\edef\tempb{#2}
 			\edef\tempc{\thisrow{#3}}
 			\edef\tempd{#4}
 			\ifx\tempa\tempb
 			\ifx\tempc\tempd
 			\else
 			\def\pgfmathresult{inf}
 			\fi
 			\else
 			\def\pgfmathresult{inf}
 			\fi
 		}
 	}
 }

\begin{document}
\begin{filecontents}{energiekosten.csv}
	Anlagentyp;FilterA;FilterB;Energiekosten
	Typ 1;20;2014;23400
	Typ 1;30;2014;23455
	Typ 1;20;2016;33434
	Typ 1;30;2016;23455
	Typ 2;20;2014;55634
	Typ 2;30;2014;43455
	Typ 2;20;2016;70344
	Typ 2;30;2016;23445
	Typ 3;20;2014;63400
	Typ 3;30;2014;43455
	Typ 3;20;2016;23123
	Typ 3;30;2016;63455
	Typ 4;20;2014;13400
	Typ 4;30;2014;43455
	Typ 4;20;2016;73434
	Typ 4;30;2016;63455
\end{filecontents}

	\begin{figure}[h]%
		\centering 
		\begin{tikzpicture}
		\begin{axis}[
		ybar,
		ylabel={Gesamtenergiekosten},
		xtick pos=left,
		ytick pos=left,
		xticklabels={Typ 1, Typ 2, Typ 3, Typ 4},
		x tick label style={rotate=45, anchor=east}
		]
		\addplot [discard if not two={FilterA}{20}{FilterB}{2014},
					red!20!black,
					fill=red!80!white] 
					table [x expr=\coordindex, y={Energiekosten},col sep=semicolon]{energiekosten.csav};
		\addplot [discard if not two={FilterA}{20}{FilterB}{2016},
			blue!20!black,
			fill=blue!80!white] 
			table [x expr=\coordindex, y={Energiekosten},col sep=semicolon]{energiekosten.csv};

		\legend{2014, 2016}
		\end{axis}
		\end{tikzpicture}
	\end{figure}
	
\end{document}

pgfplots Säulendiagramm: Kordinaten Filter, x ticklabels

von monchi » Di 6. Okt 2015, 21:11

Hi,

ich hab mir nach längerer Basteleit eine Säulendiagramm zusammengestellt.
Ich habe eine große Datei mit Daten, welche ich in verschiedenen Diagrammen (in verschiedenen Kombinationen) darstellen will.

Möglichkeit 1)
Ich lege für jedes Diagramm eine extra Datei an, welche nur die Daten zu dem jeweiligen Diagramm beinhaltet
==> sehr viel Arbeit, welche ich mir gerne ersparen möchte.

Möglichkeit 2)
Ich verwende einen "Filter" welcher nur gewisse Zeilen berücksichtigt
==> Alle Daten könnten zusammen in einer Datei bleiben

Ich hab mich für Möglichkeit 2 entschieden. Das ganze funktioniert auch wunderbar, abgesehen davon das die X-Achsenbeschriftung aus den "ungefilterten" Daten generiert wird. Zum Beispiel will ich nur Daten aus den vier Zeile 1, 5, 8 und neun berücksichtigen. Die Achsenbeschriftung wird aber unabhängig von meinen gewählten Kriterien aus den den ersten (in diesem Fall 4) Zeilen generiert.
\documentclass[]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}         	% correct pdf output (correct umlaut charaters)
\usepackage{ngerman}
\usepackage{graphicx}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepackage{tikz}
\usepackage{filecontents}

\pgfplotsset{compat=newest,compat/show suggested version=false}
\begin{document}
\begin{filecontents}{energiekosten.csv}
	Anlagentyp;FilterA;FilterB;Energiekosten
	Typ 1;20;2014;23400
	Typ 1;30;2014;23455
	Typ 1;20;2016;33434
	Typ 1;30;2016;23455
	Typ 2;20;2014;55634
	Typ 2;30;2014;43455
	Typ 2;20;2016;70344
	Typ 2;30;2016;23445
	Typ 3;20;2014;63400
	Typ 3;30;2014;43455
	Typ 3;20;2016;23123
	Typ 3;30;2016;63455
	Typ 4;20;2014;13400
	Typ 4;30;2014;43455
	Typ 4;20;2016;73434
	Typ 4;30;2016;63455
\end{filecontents}

	\begin{figure}[h]%
		\centering 
		\begin{tikzpicture}
		\pgfplotstableread[col sep=semicolon]{energiekosten.csv}\diagdata
		\begin{axis}[
		ybar,
		x filter/.code={\pgfplotstablegetelem{\coordindex}{FilterA}\of{\diagdata}
			\ifnum\pgfplotsretval=20
			\pgfplotstablegetelem{\coordindex}{FilterB}\of{\diagdata}
			\ifnum\pgfplotsretval=2016
			\else
			\def\pgfmathresult{}
			\fi
			\else
			\def\pgfmathresult{}
			\fi
		},
		ylabel={Gesamtenergiekosten},
		xtick pos=left,
		ytick pos=left,
		xticklabels from table={\diagdata}{Anlagentyp},
		xtick=data,
		x tick label style={rotate=45, anchor=east}
		]
		\addplot table [x expr=\coordindex, y={Energiekosten}] {\diagdata};  
		\legend{used}
		\end{axis}
		\end{tikzpicture}
	\end{figure}
	
\end{document}
Hat jemand eine Idee wie ich das in den Griff bekommen kann?

Nach oben