和
黑色矩形中的数字是它们的面积,但我很乐意手动输入这些值。
我认为 pgfplots 可能是正确的路线,但我一开始就被困在使用这个骨架代码,它旨在表示顶部图片中四个条形图中的第一个。
\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\begin{document}
%---------------------------------------------------------------%
\begin{tikzpicture}
\begin{axis}[
area style,
xticklabels={4, 2, 3, 1},
yticklabels = {}
]
\addplot[ybar interval,mark=no] plot coordinates { (0, 4) (5, 2) (10, 3) (15, 1)};
\end{axis}
\end{tikzpicture}
\end{document}
为了使我的问题更加有限和具体,我如何使条形变窄并将数字放在条形下方,就像我发布的图像中一样?
答案1
下面是一个名为的宏\barchart
,它接受一个必需参数和一个可选参数:
\barchart[<rectangle>]{<bar list>}
必需参数<bar list>
是矩形高度的逗号分隔列表。例如,\barchart{4,2,3,1}
产生输出:
可选<rectangle>
参数应具有以下形式:b1/b2/h
获取从条形b1
到条形的b2
高度为的黑色矩形h
。面积将自动计算。例如,\barchart[1/3/2]{4,2,3,1}
产生输出:
如果您愿意,可以使用语法放置多个[b1/b2/h1,b3/b4/h2,...]
。
此外,还有一个宏\myline
可以在图片中绘制垂直线。有一个必需的参数来提供高度。
全局变量\barwidth
将调整条形图和垂直线的大小。
以下是代码:
\documentclass{article}
\usepackage{tikz}
\newcommand{\barwidth}{.45} % width of each rectangle in cm
\newcommand{\barchart}[2][]{\tikz[baseline]{
\foreach \y[count=\x] in {#2}{
\draw[fill=gray!20] (\barwidth*\x,0) node[below, xshift=.5*\barwidth cm]{\small \y} rectangle (\barwidth*\x+\barwidth,\y*\barwidth);
}
\foreach \a/\b/\y[evaluate=\y as \A using int((\b-\a+1)*\y)] in {#1}{
\draw[fill=black](\barwidth*\a,0) rectangle (\barwidth*\b+\barwidth,\barwidth*\y);
\node[white] at ({(\a/2+\b/2+1/2)*\barwidth},\barwidth*\y/2){\large \A};
}
}}
\newcommand{\myline}[1]{\hspace{.5em}\tikz[baseline]{\draw[line width=2pt, dash pattern=on 1pt off 1pt](0,0)--(0,#1*\barwidth);}\hspace{.5em}}
\begin{document}
Here are four barcharts.
\[
\barchart{4,2,3,1}\myline{8}
\barchart{2,7,1,8,3,0,5,4}\myline{8}
\barchart{4,3,2,1}\myline{8}
\barchart{1,3,7,4,2}
\]
and
\[
\barchart[1/3/2]{4,2,3,1}\myline{8}
\barchart[7/8/4]{2,7,1,8,3,0,5,4}\myline{8}
\barchart[1/2/3]{4,3,2,1}\myline{8}
\barchart[2/4/3]{1,3,7,4,2}
\]
\end{document}