Diagramm mit tikz

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: Diagramm mit tikz

von Gast » Mo 2. Okt 2017, 11:03

Moin esdd

Herzlichen Dank für die Lösung meines Problems!! :D

von esdd » Mo 2. Okt 2017, 01:07

Wenn Du einen einzelnen Balken anders färben willst, dann ist da etwas mehr Aufwand nötig. Im folgenden Beispiel nutze ich jetzt nicht mehr die symbolischen Koordinaten. Stattdessen nehme ich den Zeilenindizes als x-Werte, die aber entsprechend beschriftet werden.
\documentclass[12pt,a4paper]{report} 
\usepackage{pgfplotstable}% lädt u.a. auch pgfplots,tikz, xcolor, ... 
\pgfplotsset{compat=newest} 
\usetikzlibrary{arrows.meta} 
\definecolor{myblue}{HTML}{92dcec} 
\definecolor{myorange}{rgb}{1,0.5,0} 
\usepackage{caption} 
\usepackage[ngerman]{babel} 
\usepackage[utf8]{inputenc} 
\begin{document} 
\noindent 
\begin{minipage}{\linewidth} 
\begin{tikzpicture} 

\pgfplotstableread{ 
Gruppe  I    II 
Hallo   13   11 
dies    10   3 
Fach    3    3 
}{\data}; 

\begin{axis}[ 
  width=\linewidth-45pt, 
  height=4.5cm, 
  scale only axis, 
  axis lines=left, 
  x axis line style={|[left]-|[right]}, 
  y axis line style={|[right]-|[left]}, 
  ylabel=Anzahl, 
  ymin=0,ymax=20, 
  ytick={5,10,15}, 
  ymajorgrids, 
  xlabel=Gruppen, 
  xtick={0,...,3},
  xticklabels={Hallo-Hallo,dies und das\\und jenes\\und noch etwas,Fach-\\personen}, 
  xticklabel style={anchor=east,rotate=45,align=center}, 
  ybar=0pt, 
  bar width=1.5cm, 
  enlarge x limits={abs=2cm}, 
  nodes near coords, 
  legend style={yshift=.75cm, column sep=1mm}, 
  legend cell align=left 
] 
\addplot[fill=myorange]
  table[
    x expr=\coordindex,
    y=I,
    skip coords between index={1}{2}% Koordinate mit Index 1 auslassen (Index startet bei 0)
  ]{\data};
\addplot[
    fill=gray,
    forget plot,% kein Einfluss auf Legende, kein Einfluss auf Verschiebung weiterer Plots
    bar shift=-.5*\pgfkeysvalueof{/pgf/bar width},% Korrektur der Verschiebung für diesen Plot
    point meta={TeX code symbolic=\def\pgfplotspointmeta{$x$}}% Vorgabe der Beschriftung des Balkens
  ]
  table[
    x expr=\coordindex,
    y expr={\coordindex==1?\thisrow{I}:nan}% nur Balken mit Koordinatenindex 1 verwenden
  ]{\data};
\addlegendentry{verschickt} 
\addplot[fill=myblue]table[x expr=\coordindex,y=II]{\data}; 
\addlegendentry{ausgefüllt zurück erhalten} 
\end{axis} 
\end{tikzpicture} 
\captionof{figure}{Anzahl der verschickten im Vergleich zur Anzahl der ausgefüllt zurück erhaltenen Umfragen} 
\end{minipage} 
\end{document}
In der Tabelle mit den Daten fungieren (eine beliebige Anzahl) Leerzeichen als Spaltentrenner. Du kannst also eine dritte Datenreihe dahinter setzen, musst nur jeweils mindestens ein Leerzeichen davor einfügen.

von Gast » So 1. Okt 2017, 19:42

Danke für den Tipp Bartman! :)
> der zweite orange Balken ist eigentlich unbekannt. Kann man dort anstatt 10 auch eine x oder z schreiben und die Farbe auf grau wechseln? Sodass nur dieser Balken eine andere Farbe hat? Er sollte aber trotzdem an 3. Stelle stehen und eine gewisse Grösse aufweisen (Grösse null auch möglich). Daran bin ich leider gescheitert...
Mit unbekannt meine ich übrigens, dass die Höhe nicht klar ist. Ich würde deshalb gerne eine andere Farbe, aber eine bestimmte Höhe (z.B. 0 oder auch 5 oder so) wählen und einfügen. Die Zahl soll dann allerdings nicht über dem Balken stehen, sondern mit einer Variablen ersetzt werden.

von Bartman » So 1. Okt 2017, 12:39

Wenn bei Dir die Abbildung wie im ersten Fall im Text stehen sollte, dann wäre wegen der Abstände zum vorherigen und nachfolgenden Text die zweite Variante empfehlenswert.
\documentclass[12pt,a4paper]{report} 
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage{caption}
\usepackage{mwe}

\begin{document} 
\blindtext

\noindent
\begin{minipage}{\linewidth}
\centering
\includegraphics[width=.5\linewidth]{example-image}
\captionof{figure}{Beschriftung}
\end{minipage}

\Blindtext[2]

\begin{center}
\begin{minipage}{\linewidth}
\centering
\includegraphics[width=.5\linewidth]{example-image}
\captionof{figure}{Beschriftung}
\end{minipage}
\end{center}

\blindtext
\end{document}
Der Befehl \pgfplotstableread wird übrigens in der Dokumentation von pgfplotstable erklärt.

von Gast » So 1. Okt 2017, 11:50

Hallo Bartmann

Ja, das habe ich natürlich.
Ich wollte das Diagramm zuerst in eine minipage verpacken, was zuerst nicht, deshalb habe ich es mit figure gemacht.

Nun habe ich es allerdings nochmals probiert und es hat geklappt. Weiss nicht, was ich zuerst falsch gemacht habe... :oops:

Das wäre mein neuer Code:
\documentclass[12pt,a4paper]{report} 
\usepackage{pgfplotstable}% lädt u.a. auch pgfplots,tikz, xcolor, ... 
\pgfplotsset{compat=newest} 
\usetikzlibrary{arrows.meta} 
\definecolor{myblue}{HTML}{92dcec} 
\definecolor{myorange}{rgb}{1,0.5,0}
\usepackage{caption}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\begin{document} 
\noindent
\begin{minipage}{\linewidth}
\begin{tikzpicture} 

\pgfplotstableread{ 
Gruppe          I    II 
Hallo-Hallo          13  11 
{dies und das}  10  3 
Fach    3   3 
}{\data}; 

\begin{axis}[ 
  width=\linewidth-45pt, 
  height=4.5cm, 
  %title=Fragebogen, 
  %title style={name=title}, 
  scale only axis, 
  axis lines=left, 
  x axis line style={|[left]-|[right]}, 
  y axis line style={|[right]-|[left]}, 
  ylabel=Anzahl, 
  ymin=0,ymax=20, 
  ytick={5,10,15}, 
  ymajorgrids, 
  xlabel=Gruppen, 
  symbolic x coords={Hallo-Hallo,dies und das,Fach}, 
  xticklabels={Hallo-Hallo,dies und das\\und jenes\\und noch etwas,Fach-\\personen}, 
  xtick=data, 
  xticklabel style={anchor=east,rotate=45,align=center}, 
  ybar=0pt, 
  bar width=1.5cm, 
  enlarge x limits={abs=2cm}, 
  nodes near coords, 
  legend style={yshift=1cm, column sep=1mm},
  legend cell align=left
] 
\addplot[fill=myorange]table[y=I]{\data}; 
\addlegendentry{verschickt} 
\addplot[fill=myblue]table[y=II]{\data}; 
\addlegendentry{ausgefüllt zurück erhalten} 
\end{axis} 
\end{tikzpicture}
\captionof{figure}{Anzahl der verschickten im Vergleich zur Anzahl der ausgefüllt zurück erhaltenen Umfragen}
\end{minipage}
\end{document}
> der zweite orange Balken ist eigentlich unbekannt. Kann man dort anstatt 10 auch eine x oder z schreiben und die Farbe auf grau wechseln? Sodass nur dieser Balken eine andere Farbe hat? Er sollte aber trotzdem an 3. Stelle stehen und eine gewisse Grösse aufweisen (Grösse null auch möglich). Daran bin ich leider gescheitert...

> noch eine Verständnisfrage: du hast doch eine Auflistung mit I und II gemacht. Wie weiss Latex, welche Zahlen wozu gehören? Spielt da der Abstand eine Rolle, denn durch längere Begriffe werden ja die Zahlen verschoben? Könnte ich, wenn ich ein anderes Diagramm mit 3 Balken pro Gruppe erstellen möchte, auch einfach eine III und die jeweiligen Zahlen hinzufügen?

von Bartman » So 1. Okt 2017, 11:41

Anonymous hat geschrieben:Ist figure eine Gleitumgebung? Bin mir nicht mehr sicher... Aber figure wird doch gebraucht, um eine Bildunterschrift hinzuzufügen?
Hast Du eine LaTeX-Einführung gelesen?

Wann sollte ich Gleitumgebungen für Tabellen und Abbildungen verwenden?

von Gast » So 1. Okt 2017, 11:20

Hallo esdd

Vielen Dank für die Hilfe!
Nun ist sieht das Diagramm schon fast so aus, wie es sollte, allerdings habe ich nochmals ein paar kleine Fragen:

> Ist figure eine Gleitumgebung? Bin mir nicht mehr sicher... Aber figure wird doch gebraucht, um eine Bildunterschrift hinzuzufügen?

> der zweite orange Balken ist eigentlich unbekannt. Kann man dort anstatt 10 auch eine x oder z schreiben und die Farbe auf grau wechseln? Sodass nur dieser Balken eine andere Farbe hat? Er sollte aber trotzdem an 3. Stelle stehen und eine gewisse Grösse aufweisen (Grösse null auch möglich). Daran bin ich leider gescheitert...

> noch eine Verständnisfrage: du hast doch eine Auflistung mit I und II gemacht. Wie weiss Latex, welche Zahlen wozu gehören? Spielt da der Abstand eine Rolle, denn durch längere Begriffe werden ja die Zahlen verschoben? Könnte ich, wenn ich ein anderes Diagramm mit 3 Balken pro Gruppe erstellen möchte, auch einfach eine III und die jeweiligen Zahlen hinzufügen?
\documentclass[12pt,a4paper]{report} 
\usepackage{pgfplotstable}% lädt u.a. auch pgfplots,tikz, xcolor, ... 
\pgfplotsset{compat=newest} 
\usetikzlibrary{arrows.meta} 
\definecolor{myblue}{HTML}{92dcec} 
\definecolor{myorange}{rgb}{1,0.5,0}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\begin{document} 
\noindent
\begin{figure}
\begin{tikzpicture} 

\pgfplotstableread{ 
Gruppe          I    II 
Hallo-Hallo          13  11 
{dies und das}  10  3 
Fach    3   3 
}{\data}; 

\begin{axis}[ 
  width=\linewidth-45pt, 
  height=4.5cm, 
  %title=Fragebogen, 
  %title style={name=title}, 
  scale only axis, 
  axis lines=left, 
  x axis line style={|[left]-|[right]}, 
  y axis line style={|[right]-|[left]}, 
  ylabel=Anzahl, 
  ymin=0,ymax=20, 
  ytick={5,10,15}, 
  ymajorgrids, 
  xlabel=Gruppen, 
  symbolic x coords={Hallo-Hallo,dies und das,Fach}, 
  xticklabels={Hallo-Hallo,dies und das\\und jenes\\und noch etwas,Fach-\\personen}, 
  xtick=data, 
  xticklabel style={anchor=east,rotate=45,align=center}, 
  ybar=0pt, 
  bar width=1.5cm, 
  enlarge x limits={abs=2cm}, 
  nodes near coords, 
   legend style={yshift=1cm},
  legend cell align=left
] 
\addplot[fill=myorange]table[y=I]{\data}; 
\addlegendentry{verschickt} 
\addplot[fill=myblue]table[y=II]{\data}; 
\addlegendentry{ausgefüllt zurück erhalten} 
\end{axis} 
\end{tikzpicture}
\caption{Anzahl der verschickten im Vergleich zur Anzahl der ausgefüllt zurück erhaltenen Umfragen}
\end{figure}
\end{document}
@Bartmann: Auch dir vielen Dank für den Tipp.

Re: pgfplots platzieren und Legende verändern

von Bartman » So 1. Okt 2017, 02:01

Anonymous hat geschrieben:Kann man es auch so einstellen, dass die Begriffe linksbündig am Symbol sind (mit kleinem Abstand)?
Dieser Abstand kann mit der Option column sep angepasst werden:
legend style={yshift=1cm, column sep=1mm},

von esdd » Sa 30. Sep 2017, 23:31

Wenn das Diagramm nicht gleiten soll, dann setze es nicht in eine Gleitumgebung. Wobei ich nicht mal weiß, ob Du das tust ...

Die Ausrichtung der Legendeneinträge lässt sich mit legend cell align=left auf linksbündig umstellen.

Ich hatte die Titelnode zum Ausrichten der Legende verwendet. Ohne Titel muss man das natürlich ändern.

Für die Zurordnung der Koordinaten ist es wichtig, dass die in der entsprechenden Tabellenspalte mit denen in symbolic x coords übereinstimmen. Da können also auch Abkürzungen verwendet werden. Es geht auch noch anders. Kommen in einer Bezeichnung Leerzeichen vor, dann muss die Bezeichnung in der Tabelle in geschweifte Klammern gesetzt werden. Was dann tatsächlich als Beschriftung am Diagramm steht wird von den Einträgen bei xticklabels bestimmt.
\documentclass[12pt,a4paper]{report} 
\usepackage{pgfplotstable}% lädt u.a. auch pgfplots,tikz, xcolor, ... 
\pgfplotsset{compat=newest} 
\usetikzlibrary{arrows.meta} 
\definecolor{myblue}{HTML}{92dcec} 
\definecolor{myorange}{rgb}{1,0.5,0} 
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\begin{document} 
\noindent 
\begin{tikzpicture} 

\pgfplotstableread{ 
Gruppe          I   II 
Hallo-Hallo          13  11 
{dies und das}  10  3 
Fach    3   3 
}{\data}; 

\begin{axis}[ 
  width=\linewidth-45pt, 
  height=4.5cm, 
  %title=Fragebogen, 
  %title style={name=title}, 
  scale only axis, 
  axis lines=left, 
  x axis line style={|[left]-|[right]}, 
  y axis line style={|[right]-|[left]}, 
  ylabel=Anzahl, 
  ymin=0,ymax=20, 
  ytick={5,10,15}, 
  ymajorgrids, 
  xlabel=Gruppen, 
  symbolic x coords={Hallo-Hallo,dies und das,Fach}, 
  xticklabels={Hallo-Hallo,dies und das,Fach-\\personen}, 
  xtick=data, 
  xticklabel style={anchor=east,rotate=45,align=center}, 
  ybar=0pt, 
  bar width=1.5cm, 
  enlarge x limits={abs=2cm}, 
  nodes near coords, 
  legend style={yshift=1cm},% <- changed
  legend cell align=left% <- added
] 
\addplot[fill=myorange]table[y=I]{\data}; 
\addlegendentry{verschickt} 
\addplot[fill=myblue]table[y=II]{\data}; 
\addlegendentry{ausgefüllt zurück erhalten} 
\end{axis} 
\end{tikzpicture} 
\end{document}

pgfplots platzieren und Legende verändern

von Gast » Sa 30. Sep 2017, 21:27

Hallo esdd

Vielen Dank für die Hilfe.
Das klappt ja wunderbar mit pgfplots.

Nun habe ich allerdings noch ein paar kleine Fragen:
> Das Diagramm wird leider auf einer nächsten Seite platziert. Allerdings wäre ich froh, wenn ich dieses direkt unter dem vorangehenden Text platzieren könnte. Habe es schon auf verschiedene Varianten versucht, doch es hat nicht geklappt. Wie geht das?

> Bei der Legende habe ich verschieden lange Begriffe bzw. bei einem Symbol mehrere. Die Begriffe werden in diesem Kästchen zentriert dargestellt. Kann man es auch so einstellen, dass die Begriffe linksbündig am Symbol sind (mit kleinem Abstand)?

> Zudem habe ich gemerkt, dass ich keinen Titel brauche, da ich eine Bildunterschrift anfüge. Ich wollte diesen löschen, allerdings kam dann die Fehlermeldung, dass der Titel fehlt. Wie kann der Titel entfernt werden?

> Bei der Beschriftung der Balken sollte ein Begriff mit einem Bindestrich geschrieben werden. Zudem sollte eine Beschriftung aus mehreren Wörtern bestehen. Bei mir kommt aber immer eine Fehlermeldung, dass der Begriff nicht definiert ist... Weiss da jemand weiter? (z.B. Hallo-Hallo bzw. Tschüss und bis bald)
\documentclass[12pt,a4paper]{report} 
\usepackage{pgfplotstable}% lädt u.a. auch pgfplots,tikz, xcolor, ...
\pgfplotsset{compat=newest}
\usetikzlibrary{arrows.meta}
\definecolor{myblue}{HTML}{92dcec} 
\definecolor{myorange}{rgb}{1,0.5,0} 
\usepackage[ngerman]{babel}
\begin{document} 
\noindent
\begin{tikzpicture}

\pgfplotstableread{
Gruppe          I   II
Halter          13  11
Nutztierhalter  10  3
Fachpersonen    3   3
}{\data};

\begin{axis}[
  width=\linewidth-45pt,
  height=4.5cm,
  title=Fragebogen,
  title style={name=title},
  scale only axis,
  axis lines=left,
  x axis line style={|[left]-|[right]},
  y axis line style={|[right]-|[left]},
  ylabel=Anzahl,
  ymin=0,ymax=20,
  ytick={5,10,15},
  ymajorgrids,
  xlabel=Gruppen,
  symbolic x coords={Halter,Nutztierhalter,Fachpersonen},
  xticklabels={Halter,Nutztier-\\halter,Fach-\\personen},
  xtick=data,
  xticklabel style={anchor=east,rotate=45,align=center},
  ybar=0pt,
  bar width=1.5cm,
  enlarge x limits={abs=2cm},
  nodes near coords,
  legend style={at={(current axis.east|-title.north)},anchor=north east}
]
\addplot[fill=myorange]table[y=I]{\data};
\addlegendentry{verschickt}
\addplot[fill=myblue]table[y=II]{\data};
\addlegendentry{ausgefüllt zurück erhalten}
\end{axis}
\end{tikzpicture} 
\end{document}

Nach oben