ybar стекированный график с отрицательными координатами

ybar стекированный график с отрицательными координатами

При использовании ybar, сложенного на смесь положительных и отрицательных координат, я не могу найти нужный мне ответ.

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

Я хотел бы получить все красные полосы длиной 4 единицы (как в координатах), хотя левые две полосы прячутся за зелеными. Есть ли решение этой проблемы? (Изменение порядка вызовов \addplotв коде выше не может это исправить.)

решение1

Я бы предложил использовать ybar stackedстиль графика, но с горизонтальным смещением компонентов, что представляет собой"водопадная диаграмма". Это хорошо показывает, как положительные и отрицательные вклады складываются в конечное значение (лучше, чем рисовать отрицательные компоненты ниже оси Y, что может ввести в заблуждение и создать большую общую длину).

Для рисования соединителей между стержнями вам придется определить новый маркер с помощью \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}

решение2

Я тоже сталкивался с этой проблемой много раз. Мой (по общему признанию, уродливый) обходной путь — создание отрицательных столбцов в отдельной axisсреде. Это неоптимально, поскольку вам нужно убедиться, что размеры и ширина столбцов одинаковы для обеих осей, и вам нужно избавиться от линий оси на второй оси, но это действительно достигает желаемого эффекта.

решение3

У нас была та же проблема.

Решение, которое мы придумали, относительно ненавязчиво. Ваш код latex остается прежним, никаких дополнительных специальных тегов, но ваши x-координаты ваших отрицательных значений немного меняются.

Поскольку каждая координата x по умолчанию складывается отдельно, мы бы отобразили положительные значения на графике, например, 1, 2, 3 и т. д., а отрицательные — на графике с координатами 0,999, 1,999, 2,999 и т. д.

Для человеческого глаза это будет выглядеть так, как будто они находятся прямо друг над другом (если нет, добавьте еще 9), но в целях укладки латекс будет укладывать их по отдельности.

положительная и отрицательная энергия в день
(источник:pnpscada.com)

Вот фрагмент кода плитки .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};
. . .

и отрывок из похожего файла Month.csv (не совсем такой, как на картинке, но идею показывает) (столбцы разделены табуляцией):

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

Связанный контент