Anpassen der Position einzelner Knoten im Balkendiagramm

Anpassen der Position einzelner Knoten im Balkendiagramm

Die Beschriftung der Balken liegt manchmal hinter dem Fehlerbalken. Sie alle anzuheben ist nicht elegant, aber ich habe keine Möglichkeit gefunden, die Positionen der einzelnen Knoten anzupassen. Ich habe den dritten Satz Balken nur aufgenommen, um zu zeigen, dass nicht alle Balken unbeschriftet sind (falls das einen Unterschied machen würde). Vielleicht gibt es eine andere Möglichkeit, die Beschriftungen festzulegen, als die Knoten in der Nähe von Koordinaten- und Punktmetadaten.

      \documentclass{book}
      \usepackage{caption}
      \usepackage{pgfplots}
      \usepackage{booktabs}
      \usepackage{pgfplotstable}

      \begin{document}
      \definecolor{gray}{cmyk}{0,0,0,0.1}
      \definecolor{gray1}{cmyk}{0,0,0,0.3}
      \definecolor{gray2}{cmyk}{0,0,0,0.5}
      \definecolor{gray3}{cmyk}{0,0,0,0.7}

      \begin{figure}[htb]
      \begin{minipage}{\textwidth}
      \pgfplotstableread{
       x    y1  y1_err  y2  y2_err  y3  y3_err  y4  y4_err meta1 meta2 meta3 meta4
       A    100 0.1 100 0.1 81  7   87  5 a a b b 
       B    100 0.1 100 0.1 83  8   97  2 a a b a 
       C    84  2   87  2   86  4   93  1 \phantom{} \phantom{} \phantom{} \phantom{} 
        }\loadedtable
        \pgfplotsset{width=18cm,compat=1.9}
        \centering
        \begin{tikzpicture}
        \begin{axis}[ybar,
        ylabel={\%}, 
        symbolic x coords={A,B,C},
        xtick={A,B,C},
        ymin=0,
        ymax=110,
        nodes near coords, 
        every node near coord/.append style={yshift=0.2cm},    
        point meta=explicit symbolic,  
        ]
        \addplot+[error bars/.cd,
        y dir=both,
        y explicit
        ][black,fill=gray]table[
        meta index=9,
        x=x,
        y=y1,
        y error=y1_err,
        ]{\loadedtable};
        \addplot+[error bars/.cd,
        y dir=both,
        y explicit
        ][black,fill=gray1]table[
        meta index=10,
        x=x,
        y=y2,
        y error=y2_err,
        ]{\loadedtable};
        \addplot+[error bars/.cd,
        y dir=both,
        y explicit
        ][black,fill=gray2]table[
        meta index=11,
        x=x,
        y=y3,
        y error=y3_err,
        ]{\loadedtable};
        \addplot+[error bars/.cd,
        y dir=both,
        y explicit
        ][black,fill=gray3]table[
        meta index=12,
        x=x,
        y=y4,
        y error=y4_err,
        ]{\loadedtable};
       \end{axis}
      \end{tikzpicture}
     \end{minipage}
    \end{figure}
    \end{document}

Antwort1

Die wichtigste Technik hierfür besteht darin, den Schlüssel zu verwenden, visualization depends onden Fehlerwert zu lesen, einige Berechnungen damit durchzuführen und das Ergebnis in einem Makro zu speichern, z. B. \myshift. Dann können Sie jeden Knoten um verschieben \myshift. Da Ihre Fehlerdaten aus verschiedenen Spalten stammen, visualization depends onmuss beim Laden der Tabelle jeder Plot hinzugefügt werden. Ich habe mich dafür entschieden, den Fehler mit einem festen Faktor ( ) zu multiplizieren, 4um die Verschiebung zu bestimmen; Sie möchten vielleicht einen anderen Algorithmus verwenden.

Beispielausgabe

\documentclass{book}

\usepackage{caption}
\usepackage{pgfplots}
\usepackage{booktabs}
\usepackage{pgfplotstable}
\usepackage{filecontents}

\pgfplotsset{compat=1.14}

\begin{document}
\definecolor{gray}{cmyk}{0,0,0,0.1}
\definecolor{gray1}{cmyk}{0,0,0,0.3}
\definecolor{gray2}{cmyk}{0,0,0,0.5}
\definecolor{gray3}{cmyk}{0,0,0,0.7}

\begin{filecontents}{mytab.dat}
x y1 y1_err y2 y2_err y3 y3_err y4 y4_err meta1 meta2 meta3 meta4
A 100 0.1 100 0.1 81 7 87 5 a a b b
B 100 0.1 100 0.1 83 8 97 2 a a b a
C 84 2 87 2 86 4 93 1 {} {} {} {}
\end{filecontents}

\begin{figure}[htb]
  \begin{minipage}{\textwidth}
    \pgfplotsset{width=18cm}
    \centering
    \begin{tikzpicture}
      \begin{axis}[ybar,
        ylabel={\%},
        symbolic x coords={A,B,C},
        xtick={A,B,C},
        ymin=0,
        ymax=110,
        nodes near coords,
        nodes near coords style={yshift=\myshift},
        point meta=explicit symbolic,
        ]
        \addplot+[error bars/.cd,
        y dir=both,
        y explicit][black,fill=gray]table[
        meta index=9,
        x=x,
        y=y1,
        y error=y1_err,
        visualization depends on=4*\thisrow{y1_err} \as \myshift,
        ] {mytab.dat};
        \addplot+[error bars/.cd,
        y dir=both,
        y explicit ][black,fill=gray1]table[
        meta index=10,
        x=x,
        y=y2,
        y error=y2_err,
        visualization depends on=4*\thisrow{y2_err} \as \myshift,
        ]{mytab.dat};
        \addplot+[error bars/.cd,
        y dir=both,
        y explicit ][black,fill=gray2]table[
        meta index=11,
        x=x,
        y=y3,
        y error=y3_err,
        visualization depends on=4*\thisrow{y3_err} \as \myshift,
        ]{mytab.dat};
        \addplot+[error bars/.cd,
        y dir=both,
        y explicit ][black,fill=gray3]table[
        meta index=12,
        x=x,
        y=y4,
        y error=y4_err,
        visualization depends on=4*\thisrow{y4_err} \as \myshift,
        ]{mytab.dat};
      \end{axis}
    \end{tikzpicture}
  \end{minipage}
\end{figure}
\end{document}

Es scheint ein Fehler zu sein, da ich das \thisrowMakro nur mit Tabellendaten in einer externen Datei zum Laufen bringen konnte. Das Einfügen der Tabelle in ein Makro und die Übergabe wie in Ihrem Originalcode schlägt einfach fehl.

Beachten Sie, dass leere Einträge in Ihren Tabellendaten einfach sein sollten {}.

verwandte Informationen