ybar-gestapeltes Diagramm mit negativen Koordinaten

ybar-gestapeltes Diagramm mit negativen Koordinaten

Wenn ich ybar auf einer Mischung aus positiven und negativen Koordinaten stapele, kann ich scheinbar nicht die gewünschte Antwort finden.

\begin{figure}
  \begin{tikzpicture}
    \begin{axis}[ybar stacked]
      \addplot[green,fill=green] coordinates { (1, 3) (2, 3) (3,3) (4,3) };
      \addplot[red,fill=red]     coordinates { (1,-4) (2,-4) (3,4) (4,4) };
    \end{axis}
  \end{tikzpicture}
\end{figure}

Ich möchte alle roten Balken 4 Einheiten lang haben (wie in den Koordinaten), obwohl die beiden linken Balken hinter den grünen versteckt sind. Gibt es dafür eine Lösung? (Das Ändern der Reihenfolge der \addplotAufrufe im obigen Code kann das Problem nicht beheben.)

Antwort1

ybar stackedIch würde vorschlagen, den Plotstil zu verwenden , aber mit horizontal versetzten Komponenten, was eine"Wasserfalldiagramm". Auf diese Weise lässt sich gut darstellen, wie sich positive und negative Beiträge zum Endwert addieren (besser, als die negativen Komponenten unterhalb der Y-Achse zu zeichnen, was irreführend zu einer größeren Gesamtlänge führen würde).

Um die Verbindungsstellen zwischen den Balken zu zeichnen, müssen Sie mit einen neuen Marker definieren \pgfdeclareplotmark.

\documentclass{article}
\usepackage{pgfplots}

\pgfdeclareplotmark{waterfall bridge}{\pgfpathmoveto{\pgfpoint{-13pt}{0pt}}\pgfpathlineto{\pgfpoint{13pt}{0pt}}\pgfusepathqstroke}

\begin{document}
  \begin{tikzpicture}
    \begin{axis}[
        ybar stacked,
        bar width=10pt,
        axis lines*=middle,
        axis on top=false,
        xtick=data,
        enlarge y limits=0.2,
        after end axis/.code={
            \node at ({rel axis cs:0,0}|-{axis cs:0,0}) [anchor=east] {0};
        }
    ]
      \addplot[
        fill=cyan,
        draw=none,
        bar shift=-8pt,
        mark options={
            gray,
            thick,
            dashed
        },
        mark=waterfall bridge
      ] coordinates { (1, 3) (2, 3) (3,3) (4,3) };
      \addplot[
        fill=orange,
        draw=none,
        bar shift=8pt
      ] coordinates { (1,-4) (2,-4) (3,4) (4,4) };
    \end{axis}
  \end{tikzpicture}


\end{document}

Antwort2

Ich bin auch schon oft auf dieses Problem gestoßen. Meine (zugegebenermaßen hässliche) Lösung besteht darin, die negativen Balken in einer separaten axisUmgebung zu erstellen. Das ist nicht optimal, da Sie sicherstellen müssen, dass die Abmessungen und Balkenbreiten für beide Achsen gleich sind, und Sie die Achsenlinien auf der zweiten Achse entfernen müssen, aber es erzielt den gewünschten Effekt.

Antwort3

Wir hatten das gleiche Problem.

Die Lösung, die wir gefunden haben, ist relativ unaufdringlich. Ihr Latex-Code bleibt gleich, keine zusätzlichen speziellen Tags, aber die x-Koordinaten Ihrer negativen Werte ändern sich ein wenig.

Da jede X-Koordinate standardmäßig separat gestapelt wird, würden wir die positiven Werte beispielsweise bei 1, 2, 3 usw. und die negativen Werte bei 0,999, 1,999, 2,999 usw. darstellen.

Für das menschliche Auge scheinen sie direkt übereinander zu liegen (wenn nicht, fügen Sie weitere 9 hinzu), aber zum Stapeln werden sie in Latex separat gestapelt.

positive und negative Energie pro Tag
(Quelle:pnpscada.com)

hier ist ein Codeauszug des .tex-Tiles:

. . .
\begin{axis}[width=20cm, height=9.75cm,
scaled ticks=false,%
%bar width=5pt,
xmin=-0.15,
xtick={1,...,\days},
xmax=\the\value{daysp}.15,
ylabel=energy in \si{kWh},
xlabel = date,
%xlabel= {\yearnow},
%xtick align=center,
%xticklabel style={rotate=90,anchor=east},
grid=major,
legend cell align=left,
%legend entries={baseline,target,trend,low demand--off-peak,low demand--standard,low demand--peak,high demand--off-peak,high demand--standard,high demand--peak},
legend style = {area legend,legend columns = 4,
%legend title = legend,
at={(0.5,-0.12)},
anchor=north},
%legend entries={baseline,target,trend,low demand--off-peak,low demand--standard,low demand--peak,high demand--off-peak,high demand--standard,high demand--peak},
title={{\month} {\yearnow} consumption for \meter},
%title style={at={(0.5,1)}},
ybar stacked,
set layers
]
. . .
\trend ;
\addplot[draw=black, fill=color8, forget plot] table [x=x,y=v8]{Month.csv};
\addplot[draw=black, fill=color1, forget plot] table [x=x,y=v1]{Month.csv};
\addplot[draw=black, fill=color12, forget plot] table [x=x,y=v12]{Month.csv};
\addplot[draw=black, fill=color6, forget plot] table [x=x,y=v6]{Month.csv};
\addplot[draw=black, fill=color9, forget plot] table [x=x,y=v9]{Month.csv};
 \addplot[draw=black, fill=color3, forget plot] table [x=x,y=v3]{Month.csv};
. . .

und ein Auszug aus einer ähnlichen Datei Month.csv (nicht genau dasselbe wie auf dem Bild, aber es zeigt die Idee) (Spalten sind durch Tabulatoren getrennt):

x   v7  v8  v1  v2  v11 v12 v5  v6  v9  v10 v3  v4  target
. . .
6.25    0   0   0   0   0   0   0   0   0   0   0   0   1682.16
6.5 0   0   0   0   0   0   0   0   0   0   0   0   1682.16
6.999   0   0   -30 0   0   0   0   0   0   0   -54.500 0   1682.16
7   0   0   0   200 0   0   0   0   0   0   0   1190.000    1682.16
7.25    0   0   0   0   0   0   0   0   0   0   0   0   1682.16
7.5 0   0   0   0   0   0   0   0   0   0   0   0   1682.16
7.999   0   0   -50 0   0   0   0   0   0   0   -93.000 0   1682.16
8   0   0   0   400 0   0   0   0   0   0   0   1068.000    1682.16
. . .

verwandte Informationen