Gráfico apilado de ybar con coordenadas negativas

Gráfico apilado de ybar con coordenadas negativas

Cuando uso ybar apilado en una combinación de coordenadas positivas y negativas, parece que no puedo encontrar la respuesta que quiero.

\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}

Me gustaría que todas las barras rojas tengan 4 unidades de largo (como están en las coordenadas), aunque las dos barras de la izquierda se esconden detrás de las verdes. Hay alguna solución para esto? (Cambiar el orden de las \addplotllamadas en el código anterior no puede solucionarlo).

Respuesta1

Yo sugeriría usar el ybar stackedestilo de trama, pero con los componentes desplazados horizontalmente, lo que constituye una"gráfico cascada". Esto funciona muy bien para mostrar cómo las contribuciones positivas y negativas se suman al valor final (mejor que dibujar los componentes negativos debajo del eje y, lo que crearía engañosamente una longitud total mayor).

Para dibujar los conectores entre las barras, tendrás que definir un nuevo marcador usando \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}

Respuesta2

También me he encontrado con este problema muchas veces. Mi solución (ciertamente fea) es crear las barras negativas en un axisentorno separado. No es óptimo porque hay que asegurarse de que las dimensiones y los anchos de las barras sean los mismos para ambos ejes, y hay que deshacerse de las líneas de los ejes en el segundo eje, pero logra el efecto deseado.

Respuesta3

Tuvimos el mismo problema.

La solución que hemos encontrado es relativamente no intrusiva. Su código de látex permanece igual, sin etiquetas especiales adicionales, pero sus coordenadas x de sus valores negativos cambian un poco.

Dado que cada coordenada x por defecto se apila por separado, trazaríamos los positivos en, por ejemplo, 1, 2, 3, etc. y los negativos en 0,999, 1,999, 2,999, etc.

Para el ojo humano, parecería que están directamente uno encima del otro (si no, agregue otros 9), pero para apilarlos, el látex los apilará por separado.

energía positiva y negativa por día
(fuente:pnpscada.com)

Aquí hay un extracto de código del mosaico .tex:

. . .
\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};
. . .

y un extracto de un archivo Month.csv similar (no exactamente igual a la imagen, pero muestra la idea) (las columnas están delimitadas por tabulaciones):

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
. . .

información relacionada