堆积条形图内的多个值-Tikz

堆积条形图内的多个值-Tikz

我想要一个如附件所示的堆叠条形图。但是,无法弄清楚如何让条形图显示多个值?

以下是代码。

\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, ymin=0,  
    bar width=8mm,
    symbolic x coords={2016,2017,2018,2019,2020},
    xtick=data,
    nodes near coords, 
    legend style={at={(0.05,0.8)},anchor=west}
    ]

    \addplot [fill=blue!20, show sum on top] coordinates {
        ({2016},1)
        ({2017},0)
        ({2018},1)
        ({2019},1)
        ({2020},1)};
    \addplot [fill=red!20,show sum on top] coordinates {
        ({2016},0)
        ({2017},3)
        ({2018},3)
        ({2019},4)
        ({2020},1)};
    \addplot [fill=green!20,show sum on top] coordinates {
        ({2016},0)
        ({2017},1)
        ({2018},4)
        ({2019},4)
        ({2020},1)};
    \addplot [fill=orange!20,show sum on top] coordinates {
        ({2016},0)
        ({2017},0)
        ({2018},0)
        ({2019},0)
        ({2020},2)};
    \legend{CCTV \& Visual,Remote sensing, Social media, WSN \& IoT}
    \end{axis}
    \end{tikzpicture}

代码生成的图。我想删除条形内的多个值并仅保留正确的值。

在此处输入图片描述

答案1

你似乎抄袭show sum on top这个答案或一些相关帖子。这个答案明确只使用第二个(=最后一个)命令中的样式\addplot。这里这种方法不起作用,因为最后一个\addplot有零。所以需要注意这一点。有两个选项:

  1. 如果数据以表格形式呈现,则可以使用 pgfplots 确定何时放置总和。给定表格,有优秀的帖子为您计算总和。因此,让我们关注没有桌子的情况,就像实际问题一样。然后
  2. 您可以有选择地在适当的图上添加总和,并使用在此答案中定义的样式selective show sum on top

由于数据不是表格形式,因此这里是选项 2。样式selective show sum on top接受一个参数(或者可以使用键将其串联到列表上/.list,如下所示),该参数指定应在非零条目中的哪些位置计算和显示总和。如果您未指定参数,0将使用。

\documentclass[tikz,border=3mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.17}
\begin{document}
\begin{tikzpicture}

    \pgfplotsset{
        selective show sum on top/.style={
            /pgfplots/scatter/@post marker code/.append code={%
                \ifnum\coordindex=#1
                   \node[
                   at={(normalized axis cs:%
                       \pgfkeysvalueof{/data point/x},%
                       \pgfkeysvalueof{/data point/y})%
                   },
                   anchor=south,
                   ]
                   {\pgfmathprintnumber{\pgfkeysvalueof{/data point/y}}};
                \fi
            },
        },selective show sum on top/.default=0
    }

    \begin{axis}[width=10cm,
    ybar stacked, ymin=0,  
    bar width=8mm,
    symbolic x coords={2016,2017,2018,2019,2020},
    xtick=data,
    nodes near coords, 
    legend style={at={(0.05,0.8)},anchor=west}
    ]

    \addplot [fill=blue!20,selective show sum on top] coordinates {
        ({2016},1)
        ({2017},0)
        ({2018},1)
        ({2019},1)
        ({2020},1)};
    \addplot [fill=red!20] coordinates {
        ({2016},0)
        ({2017},3)
        ({2018},3)
        ({2019},4)
        ({2020},1)};
    \addplot [fill=green!20,selective show sum on top/.list={0,1,2}] coordinates {
        ({2016},0)
        ({2017},1)
        ({2018},4)
        ({2019},4)
        ({2020},1)};
    \addplot [fill=orange!20,selective show sum on top] coordinates {
        ({2016},0)
        ({2017},0)
        ({2018},0)
        ({2019},0)
        ({2020},2)};
    \legend{CCTV \& Visual,Remote sensing, Social media, WSN \& IoT}
    \end{axis}
 \end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容