Как получить составную полосу с отдельными значениями и суммой сбоку?

Как получить составную полосу с отдельными значениями и суммой сбоку?

На основеэтотвопрос Мне удалось разместить частичные и общие значения на моей столбчатой ​​диаграмме. Однако мои столбцы имеют некоторые действительно маленькие значения, и невозможно втиснуть числа в некоторые диапазоны. Я хотел бы сместить эти метки в сторону. Как мне это сделать?

Обратите внимание, что в одном случае у меня есть два последовательных небольших диапазона, поэтому было бы здорово, если бы эти значения располагались по разные стороны.

Заранее спасибо!

Вот что у меня есть на данный момент:

введите описание изображения здесь

И соответствующий код:

\documentclass[tikz,border=10pt]{standalone}
\usepackage{pgfplots,pgfplotstable}
\pgfplotsset{compat=1.9}

\begin{document}
  \begin{tikzpicture}
    \pgfplotsset{
        show sum on top/.style={
            /pgfplots/scatter/@post marker code/.append code={%
                \node[
                at={(normalized axis cs:%
                    \pgfkeysvalueof{/data point/x},%
                    \pgfkeysvalueof{/data point/y})%
                },
                anchor=south,
                ]
                {\pgfmathprintnumber{\pgfkeysvalueof{/data point/y}}};
            },
        },
    }
    
    \begin{axis}[ybar stacked,
        nodes near coords,
        title={Energy spent},
        xtick={0,...,4},
        bar width=25pt,
        ymin=0,
        enlarge x limits=0.125,
        ylabel = Energy (J),
        legend entries={A,
            B,
            C,
            D},
        legend pos=outer north east,
    ]
    
    \addplot[fill=blue!80] coordinates 
    {(0,0) (1,0) (2,20.544) (3,21.192)};
    \addplot[fill=cyan!80] coordinates 
    {(0,0) (1,0) (2,9.610) (3,9.681)};
    \addplot[fill=red!80] coordinates 
    {(0,0.505) (1,12.505) (2,0.247) (3,1.975)};
    \addplot[fill=pink!80, show sum on top] coordinates 
    {(0,3.772) (1,1.075) (2,0.439) (3,2.066)};
    
    \end{axis}
  \end{tikzpicture}
 \end{document}

решение1

Так что это немного сложно решить из доков nodes near coords alignв сочетании с visualization depends onдолжно было быть серебряной пулей. Странно, но это не получается.

Вместо этого нужно объединить visualization depends onс every node near coord/.append styleкак обходной путь.

Необходимо также включить их данные в строку, как поясняется@Symbol1, чтобы предотвратить ошибки.

Package PGF Math Error: Unknown function `thisrow_unavailable_load_table_directly' (in 'thisrow_unavailable_load_table_directly')

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

\documentclass[tikz,border=10pt]{standalone}
\usepackage{pgfplots,pgfplotstable}
\pgfplotsset{compat=1.12}

\begin{document}
  \begin{tikzpicture}
    \pgfplotsset{
        show sum on top/.style={
            /pgfplots/scatter/@post marker code/.append code={%
                \node[
                at={(normalized axis cs:%
                    \pgfkeysvalueof{/data point/x},%
                    \pgfkeysvalueof{/data point/y})%
                },
                anchor=south,
                ]
                {\pgfmathprintnumber{\pgfkeysvalueof{/data point/y}}};
            },
        },
    }

    \begin{axis}[ybar stacked,
        nodes near coords,
        title={Energy spent},
        xtick={0,...,4},
        bar width=25pt,
        ymin=0,
        enlarge x limits=0.125,
        ylabel = Energy (J),
        legend entries={A,
            B,
            C,
            D},
        legend pos=outer north east,
    ]

    \addplot+[visualization depends on={value \thisrow{Ax} \as \xdelta},
              visualization depends on={value \thisrow{Ay} \as \ydelta},
              every node near coord/.append style={xshift=\xdelta,yshift=\ydelta}] table [x={x}, y={A}] {
      x A      Ax Ay 
      0 0      0  0  
      1 0      0  0  
      2 20.544 0  0  
      3 21.192 0  0  
    };
    \addplot+[visualization depends on={value \thisrow{Bx} \as \xdelta},
              visualization depends on={value \thisrow{By} \as \ydelta},
              every node near coord/.append style={xshift=\xdelta,yshift=\ydelta}] 
     table [x={x}, y={B}] {
      x B     Bx By    
      0 0     0  0     
      1 0     0  0     
      2 9.610 0  0   
      3 9.681 0  0     
    };
    \addplot+[visualization depends on={value \thisrow{Cx} \as \xdelta},
              visualization depends on={value \thisrow{Cy} \as \ydelta},
              every node near coord/.append style={xshift=\xdelta,yshift=\ydelta}] 
     table [x={x}, y={C}] {
      x C      Cx  Cy 
      0 0.505  25  5  
      1 12.505 0   0  
      2 0.247  -25 -10  
      3 1.975  -25 -10  
    };
    \addplot+[visualization depends on={value \thisrow{Dx} \as \xdelta},
              visualization depends on={value \thisrow{Dy} \as \ydelta},
              every node near coord/.append style={xshift=\xdelta,yshift=\ydelta},
              show sum on top] 
     table [x={x}, y={D}] {
      x D      Dx  Dy
      0 3.772  0   0 
      1 1.075 -25  0 
      2 0.439 -25  0
      3 2.066 -25  0
    };

    \end{axis}
  \end{tikzpicture}
 \end{document}

Обратите внимание, что у pgfplots достаточно разумные значения по умолчанию, поэтому я вставил параметры +between \addplotи , []следовательно,в результатецвета немного отличаются.

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