
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 \addplot
llamadas en el código anterior no puede solucionarlo).
Respuesta1
Yo sugeriría usar el ybar stacked
estilo 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 axis
entorno 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.
(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
. . .