使用 \foreach 绘制堆积条形图

使用 \foreach 绘制堆积条形图

使用以下答案中的代码这个问题,条形图是否可以绘制为堆积条形图,如下图所示

\documentclass{beamer}
\beamertemplatenavigationsymbolsempty
\usepackage{tikz}
\usetikzlibrary{patterns}
\begin{document}
\begin{frame}[t]
\frametitle{}
\begin{tikzpicture}[scale=.4, transform shape,linecolor/.style={thick,blue}]
\pgfmathsetmacro{\incrmnt}{1.}
\pgfmathsetmacro{\inc}{5}
\draw [thick,-latex](0,0) -- (8,0) node [black, xshift=.35cm, yshift=0cm] {Age};
\draw [thick,-latex](0,0) -- (0,6) node [black, xshift=0cm, yshift=.3cm] {Fr.};
\foreach \y [evaluate=\y as \aff using int(\y*2)]in {1,...,5}{
\draw [linecolor] (.15,\incrmnt*\y) -- +(0:-.3) node [left] {\aff};
}

\foreach \x [evaluate= \x as \aff using int(\inc*\x+20)]in {1,...,6}{
\draw [linecolor] (\incrmnt*\x,.15) -- +(-90:.3) node [below] {\aff};
}

\draw[ybar interval,pattern=north west lines]
plot coordinates{(1,1) (2,4) (3,5) (4,2) (5,0)};
\end{tikzpicture}
\end{frame}

\begin{frame}[t]
\frametitle{}
\begin{tikzpicture}[scale=.4, transform shape,linecolor/.style={thick,blue}]
\pgfmathsetmacro{\incrmnt}{1.}
\pgfmathsetmacro{\inc}{5}
\draw [thick,-latex](0,0) -- (14,0);
\draw [thick,-latex](0,0) -- (0,6);
\foreach \y [evaluate=\y as \aff using int(\y*2)]in {1,...,5}{
\draw [] (.15,\incrmnt*\y) -- +(0:-.3) node [left] {\aff};
}

\draw[ybar,bar width=2cm,pattern=north west lines]
plot coordinates{(2,3.5)  (7,5.5) (12,2) 
};
\node[below] at (2,0) {Pass};
\node[below] at (7,0) {Good};
\node[below] at (12,0) {V. Good};
\end{tikzpicture}
\end{frame}
\end{document}

在此处输入图片描述

在此处输入图片描述

在此处输入图片描述

答案1

像 tex.stackexchange 这样的问答网站的原则是询问只有一个一次只回答一个问题。所以我只会回答第一的图。第二个已经有答案了@marmot 在评论中向您提供了其链接。

至于第三点,它本身就值得提出一个基于真实问题和真实数据的真实问题。也就是说,这个问题是真正出现在你身上的,并且是你真正需要的真实数据。

Tikz没有操作可以轻松制作此类图形。该pgfplots软件包允许您构建它们。缺点是它涉及学习一个包含约 600 页文档的新软件包,这必然会花费大量时间。

请注意,加载pgfplots包后必须使用 pgfplots 版本\pgfplotsset{compat=1.16}(迄今为止的最新版本)。事实上,它确保向后兼容性编写的代码与 pgfplots 的未来版本兼容。因此,代码将始终产生相同的结果。

plotpgfplots 上调用了 tikz 包的操​​作。addplot此操作只能在axis环境中执行。因此,代码包含在 2 个环境中:第一个tikzpicture,第二个axis

\begin{tikzpicture}
\begin{axis}[ybar stacked]
\addplot [fill=green] coordinates{(25,1) (30,4) (35,5) (40,2) (45,0)};
\addplot [fill=cyan] coordinates{(25,1) (30,1) (35,1.5) (40,.5) (45,2)};
\addplot [pattern color=red,draw=black,pattern=north east lines]coordinates{(25,.5) (30,2) (35,1) (40,1) (45,0.5)};
\end{axis}
\end{tikzpicture}

默认情况下,pgfplot 生成的图形会绘制两次横坐标轴(在图的上方和下方),并且 y 轴也绘制两次。

默认

要以常规方式显示它,您必须在选项中指定: axis x line=bottom,axis y line=left,

可以使用键指定最小坐标,ymin=0,ymax=10,xmin=20,xmax=50, 数据用ybar stacked键在堆栈中表示。

图-1

在此图中,条形图位于横坐标上方的中心,而您想将它们放置在坐标之间。我尝试使用密钥ybar interval stacked,但它不起作用。要么是我不明白它是如何工作的,要么是包有错误?

因此,为了解决这个问题,我用键放大了条形图,bar width=5这意味着条形图的宽度为 5 个单位,单位是横坐标的单位。

图-2

为了将它们放置在正确的位置,我使用 键将它们向右移动了 2.5 个单位(横坐标轴的单位)bar shift=2.5

最终结果是:

最终的

最终的代码是:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{patterns}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}

\begin{document}
\begin{tikzpicture}
\begin{axis}[ybar stacked,
            axis x line=bottom,axis y line=left,
            ymin=0,ymax=10, xmin=20,xmax=50,
            minor y tick num=1,
            bar width=5,
            bar shift=2.5,
]
\addplot [fill=green]coordinates{(25,1) (30,4) (35,5) (40,2) (45,0)};
\addplot [fill=cyan]coordinates{(25,1) (30,1) (35,1.5) (40,.5) (45,2)};
\addplot [pattern color=red,draw=black,pattern=north east lines]coordinates{(25,.5) (30,2) (35,1) (40,1) (45,0.5)};
\end{axis}
\end{tikzpicture}
\end{document}

使用 www.DeepL.com/Translator 翻译

相关内容