我想要一个如附件所示的堆叠条形图。但是,无法弄清楚如何让条形图显示多个值?
以下是代码。
\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
有零。所以需要注意这一点。有两个选项:
- 如果数据以表格形式呈现,则可以使用 pgfplots 确定何时放置总和。给定表格,有优秀的帖子为您计算总和。因此,让我们关注没有桌子的情况,就像实际问题一样。然后
- 您可以有选择地在适当的图上添加总和,并使用在此答案中定义的样式
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}