gráfico empilhado ybar com coordenadas negativas

gráfico empilhado ybar com coordenadas negativas

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 \addplotchamadas no código acima não pode resolver o problema.)

Responder1

Eu sugeriria usar o ybar stackedestilo 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 axisambiente 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.

energia positiva e negativa por dia
(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
. . .

informação relacionada