Wie kann ich in einem Barplot in TikZ die Markierungen hinzufügen, die anzeigen, dass ein signifikanter Unterschied besteht? Die Markierungen bestehen oft aus einer vereinfachten Klammer und einem Asterisk (Sternchen). Unten mal ein Beispieldatensatz und eine Abbildung in die ich manuell die entsprechende Markierung (in rot) hinzugefügt habe.

Gibt es dafür eine vorgefertigte Lösung oder ist Handarbeit erforderlich?

Open in Online-Editor
\documentclass[11pt, border=5mm]{standalone}
\usepackage{pgfplots, pgfplotstable}
\usetikzlibrary{patterns}

\begin{document}
\begin{tikzpicture}
  \begin{axis}[
  width=11cm,
  height=8.5cm,
  ybar=0pt,
  bar width=40pt,
  enlarge x limits=0.5,
  legend style={at={(0.05,0.95)},anchor=north west,draw=none},
  legend cell align=left,
  xlabel={Aufgabe},
  xtick={data},
  symbolic x coords={AufgabeABC,AufgabeXYZ},
  ymin=2.5,
  ymax=9.5,
  ylabel={Messwert},
  ytick={3,4,...,9}
  ]
  \addplot[black,fill=lightgray,error bars/.cd,y dir=both,y explicit] coordinates {
    (AufgabeABC,3.9391) +- (0,0.55421)
    (AufgabeXYZ,5.6836) +- (0,0.89612)
  };
  \addlegendentry{~Kontrollgruppe};
  \addplot[black,fill=white,postaction={pattern=north east lines,pattern color=gray},error bars/.cd,y dir=both,y explicit] coordinates {
    (AufgabeABC,3.8927) +- (0,1.08049)
    (AufgabeXYZ,6.9836) +- (0,1.3073)
  };
  \addlegendentry{~Experimentalgruppe};
  \end{axis}
\end{tikzpicture}
\end{document}

Barplot mit manuell hinzugefügter Markierung

gefragt 15 Feb '15, 15:02

Andr%C3%A9's gravatar image

André
986252836
Akzeptiert-Rate: 33%


Das Makro \pgfplotbarshift enthält die Verschiebung der Balken gegenüber der eigentlichen Koordinate. Damit lässt sich dann ein Makro für das Einfügen solcher Klammern in axis Umgebungen definieren, das als Argumente zum einen die gemeinsame x-Koordinate der Balken und zum anderen die y-Koordinate für die unteren Enden der Klammer erwartet.

Open in Online-Editor
\newcommand\significant[2]{
  \draw[purple,thick]([xshift=-\pgfplotbarshift]axis cs:#1,#2)
    --++(0pt,10pt)
    --node[above]{$\ast$}++(2*\pgfplotbarshift,0pt)
    --++(0pt,-10pt);
}

Da axis cs explizit angegeben ist, können in beiden Argumenten auch die definierten symbolischen Werte der Koordinaten angegeben werden.

Im folgenden Beispiel wird dann einfach mit

Open in Online-Editor
\significant{AufgabeXYZ}{8.5}

eine Klammer mit darüber befindlichem Asterisk so bei AufgabeXYZ eingefügt, dass sich deren untere Enden auf der Höhe des y-Wertes 8.5 befinden.

alt text

Code:

Open in Online-Editor
\documentclass[11pt, border=5mm]{standalone}
\usepackage{pgfplots, pgfplotstable}
\pgfplotsset{compat=newest}
\usetikzlibrary{patterns}

\newcommand\significant[2]{
  \draw[purple,thick]([xshift=-\pgfplotbarshift]axis cs:#1,#2)
    --++(0pt,10pt)
    --node[above]{$\ast$}++(2*\pgfplotbarshift,0pt)
    --++(0pt,-10pt);
}

\begin{document}
\begin{tikzpicture}
  \begin{axis}[
  width=11cm,
  height=8.5cm,
  ybar=0pt,
  bar width=40pt,
  enlarge x limits=0.5,
  legend style={at={(0.05,0.95)},anchor=north west,draw=none},
  legend cell align=left,
  xlabel={Aufgabe},
  xtick={data},
  symbolic x coords={AufgabeABC,AufgabeXYZ},
  ymin=2.5,
  ymax=9.5,
  ylabel={Messwert},
  ytick={3,4,...,9}
  ]
  \addplot[black,fill=lightgray,error bars/.cd,y dir=both,y explicit] coordinates {
    (AufgabeABC,3.9391) +- (0,0.55421)
    (AufgabeXYZ,5.6836) +- (0,0.89612)
  };
  \addlegendentry{~Kontrollgruppe};
  \addplot[black,fill=white,postaction={pattern=north east lines,pattern color=gray},error bars/.cd,y dir=both,y explicit] coordinates {
    (AufgabeABC,3.8927) +- (0,1.08049)
    (AufgabeXYZ,6.9836) +- (0,1.3073)
  };
  \significant{AufgabeXYZ}{8.5}
  \addlegendentry{~Experimentalgruppe};
  \end{axis}
\end{tikzpicture}
\end{document}

Verwendet man jetzt für ybar und/oder bar width andere Werte, passt sich die Klammer automatisch an. Zum Beispiel liefern

Open in Online-Editor
  ybar=10pt,
  bar width=20pt,

mit ansonsten gleichem Code

alt text


Umlaute in den symbolischen Koordinaten

Damit Umlaute einfach in den symbolischen Koordinaten für die Achsen und den Plot verwendet werden können, wird mindestens Version 1.11 benötigt. Leider scheinen die Umlaute aber selbst mit Version 1.12 nicht für Koordinatenangaben bei \draw zu funktionieren. Es gibt zwei Möglichkeiten trotzdem Umlaute zu nutzen.

Zum einen (Danke an @Clemens) kann man detokenize beim Aufruf von \significant verwenden, also

Open in Online-Editor
\significant{Tonh\detokenize{ö}henangabe}{8.5}

mit obigem Code, wenn da statt AufgabeXYZ der Wert Tonhöhenangabe steht.

Zum anderen ist es möglich mit voranstehendem [normalize] die Nummer der Koordinate zu verwenden. Dann muss bei der Definition des Befehles \significant das #1 zusätzlich in geschweifte Klammern gesetzt werden. Zu beachten ist, dass die Nummerierung der Koordinaten bei 0 beginnt.

Open in Online-Editor
\documentclass[11pt, border=5mm]{standalone}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{pgfplots, pgfplotstable}
\pgfplotsset{compat=1.11}
\usetikzlibrary{patterns}

\newcommand\significant[2]{
  \draw[purple,thick]([xshift=-\pgfplotbarshift]axis cs:{#1},#2)
    --++(0pt,10pt)
    --node[above]{$\ast$}++(2*\pgfplotbarshift,0pt)
    --++(0pt,-10pt);
}

\begin{document}
\begin{tikzpicture}
  \begin{axis}[
  width=11cm,
  height=8.5cm,
  ybar=0pt,
  bar width=40pt,
  enlarge x limits=0.5,
  legend style={at={(0.05,0.95)},anchor=north west,draw=none},
  legend cell align=left,
  xlabel={Aufgabe},
  xtick={data},
  symbolic x coords={AufgabeABC,Tonhöhenangabe},
  ymin=2.5,
  ymax=9.5,
  ylabel={Messwert},
  ytick={3,4,...,9}
  ]
  \addplot[black,fill=lightgray,error bars/.cd,y dir=both,y explicit] coordinates {
    (AufgabeABC,3.9391) +- (0,0.55421)
    (Tonhöhenangabe,5.6836) +- (0,0.89612)
  };
  \addlegendentry{~Kontrollgruppe};
  \addplot[black,fill=white,postaction={pattern=north east lines,pattern color=gray},error bars/.cd,y dir=both,y explicit] coordinates {
    (AufgabeABC,3.8927) +- (0,1.08049)
    (Tonhöhenangabe,6.9836) +- (0,1.3073)
  };
  \significant{[normalized]1}{8.5}
  \addlegendentry{~Experimentalgruppe};
  \end{axis}
\end{tikzpicture}
\end{document}

Wenn man die Klammer bei AufgabeABC setzen möchte, könnte man weiterhin direkt die symbolische Koordinate nutzen, also zum Beispiel \significant{AufgabeABC}{5.25}.

Permanenter link

beantwortet 15 Feb '15, 18:20

esdd's gravatar image

esdd
17.8k284257
Akzeptiert-Rate: 62%

bearbeitet 17 Feb '15, 21:47

@esdd: Danke Dir, ebenso wie Thorsten eine echt tolle Lösung! Im Original habe ich aber nicht „AufgabeABC“ sondern „Tonhöhenaufgabe“. Wenn ich das in dem Beispiel hier ersetze, fliegt der Umlaut lediglich raus. Wenn ich das in meinem gesamten Dokument einfüge, erhalte ich einen langen Satz an Fehlermeldungen. Kann man das noch irgendwie anders lösen/umgehen?

(17 Feb '15, 20:21) André

@Andre Ich habe meine Antwort für den Fall von Umlauten bzw. Sonderzeichen in den Koordinatenangaben, die bei \draw tatsächlich Probleme machen, ergänzt.

(17 Feb '15, 21:18) esdd
1

@esdd Das Umlaut-Problem sieht für mich wie ein Expansionsproblem aus. Interessanterweise verschwindet der Fehler, wenn man \significant{\detokenize{äö}}{8.5} aufruft...

(17 Feb '15, 21:36) cgnieder

@Clemens Danke, habe ich jetzt in die Antwort übernommen. Bis Version 1.10 musste man das auch für den Plot selbst machen, siehe Sonderzeichen in pgfplot zur Achsenbeschriftung.

(17 Feb '15, 21:50) esdd
1

@esdd Das Problem hier scheint aber bei TikZ selber zu liegen. Ein Minibeispiel mit TikZ, \usepackage{utf8]{inputenc} und \coordinate (äö) ... produziert einen ähnlichen Fehler. Das Problem scheint mir beim Macro \pgfk@/tikz/name/.@cmd zu liegen, das ein \edef ausführt (\edef\tikz@fig@name{\tikz@pp@name {#1}}). Z.B.: \csname pgfk@/tikz/name/.@cmd\endcsname äö\pgfeov\show\tikz@fig@name

(17 Feb '15, 22:10) cgnieder

In solchen mit »pgfplots« erstellten Diagrammen kann für zusätzliche Zeichnungselemente auf das Koordinatensystem des Graphen (axis cs) zugegriffen werden. Dann lassen sich diese Elemente verhältnismäßig leicht einfügen. Die letzte Zeile innerhalb der Umgebung axis erzeugt das im Bild rot gefärbte Element. Genaueres ist in der Anleitung von »pgfplots« nachzulesen.

Open in Online-Editor
\documentclass[11pt,border=2pt]{standalone}
\usepackage[T1]{fontenc}
\usepackage{pgfplots}
\usetikzlibrary{patterns}

\pgfplotsset{
  compat=1.12,
  xlabel near ticks,
  ylabel near ticks
}

\begin{document}
  \begin{tikzpicture}
    \begin{axis}[
      width=11cm,
      height=8.5cm,
      ybar=0pt,
      bar width=40pt,
      enlarge x limits=0.5,
      legend style={at={(0.05,0.95)},anchor=north west,draw=none},
      legend cell align=left,
      xlabel={Aufgaben},
      xtick={1,2},
      xticklabels={AufgabeABC,AufgabeXYZ},
      ymin=2.5,
      ymax=9.5,
      ylabel={Messwert},
      ytick={3,4,...,9}
    ]
      \addplot[black,fill=lightgray,error bars/.cd,y dir=both,y explicit] coordinates {
        (1,3.9391) +- (0,0.55421)
        (2,5.6836) +- (0,0.89612)
      };
      \addlegendentry{~Kontrollgruppe};
      \addplot[black,fill=white,postaction={pattern=north east lines,pattern color=gray},error bars/.cd,y dir=both,y explicit] coordinates {
        (1,3.8927) +- (0,1.08049)
        (2,6.9836) +- (0,1.3073)
      };
      \addlegendentry{~Experimentalgruppe};
      \draw[red,thick] (axis cs:1.85,8.75) -- (axis cs:1.85,9) -- (axis cs:2.15,9) node[above,midway] {$\ast$} -- (axis cs:2.15,8.75);
    \end{axis}
  \end{tikzpicture}
\end{document}

Um das Einfügen zu erleichtern, wurden einige Optionen der Umgebung axis verändert (xtick und xticklabels).

Permanenter link

beantwortet 15 Feb '15, 18:02

Thorsten's gravatar image

Thorsten
1.6k325
Akzeptiert-Rate: 58%

@Thorsten: Danke, tolle Lösung! Mit der Zeile compat=1.12 kompiliert es allerdings nicht.

(17 Feb '15, 20:00) André

@Andre 1.12 ist die derzeit aktuelle pgfplots Version, die auch auf CTAN und in TeX Live ist. MiKTeX hat noch die Version 1.11 und bei Overleaf wird sogar noch die Version 1.10 benutzt. Wenn Du eine ältere Version als 1.12 nutzt, dann setze deren Versionsnummer für compat ein. Alternativ geht auch compat=newest.

(17 Feb '15, 20:05) esdd
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×730
×2

gestellte Frage: 15 Feb '15, 15:02

Frage wurde gesehen: 13,674 Mal

zuletzt geändert: 17 Feb '15, 22:10