
Ao usar ybar empilhado em uma mistura de coordenadas positivas e negativas, não consigo encontrar a resposta que desejo.
\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}
Eu gostaria que todas as barras vermelhas tivessem 4 unidades de comprimento (como estão nas coordenadas), embora as duas barras da esquerda estejam escondidas atrás das verdes. Existe alguma solução para isso? (Alterar a ordem das \addplot
chamadas no código acima não pode resolver o problema.)
Responder1
Eu sugeriria usar o ybar stacked
estilo de plotagem, mas com os componentes deslocados horizontalmente, o que constitui um"gráfico em cascata". Isso funciona muito bem para mostrar como as contribuições positivas e negativas se somam ao valor final (melhor do que desenhar os componentes negativos abaixo do eixo y, o que criaria erroneamente um comprimento total maior).
Para desenhar os conectores entre as barras, você terá que definir um novo 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}
Responder2
Também já me deparei com esse problema muitas vezes. Minha solução alternativa (reconhecidamente feia) é criar as barras negativas em um axis
ambiente separado. Não é o ideal porque você precisa garantir que as dimensões e larguras das barras sejam iguais para ambos os eixos e precisa se livrar das linhas do eixo no segundo eixo, mas consegue o efeito desejado.
Responder3
Nós tivemos o mesmo problema.
A solução que encontramos é relativamente não intrusiva. Seu código látex permanece o mesmo, sem tags especiais adicionais, mas suas coordenadas x de seus valores negativos mudam um pouco.
Como cada coordenada x por padrão é empilhada separadamente, representaríamos graficamente os positivos em, por exemplo, 1, 2, 3, etc. e os negativos em 0,999, 1,999, 2,999, etc.
Para o olho humano, eles pareceriam estar diretamente um em cima do outro (se não, adicione mais 9), mas para fins de empilhamento, o látex irá empilhá-los separadamente.
(fonte:pnpscada.com)
aqui está um extrato de código do bloco .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};
. . .
e um extrato de um arquivo Month.csv semelhante (não exatamente igual à imagem, mas mostra a ideia) (as colunas são delimitadas por tabulações):
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
. . .