如何绘制这些条形图

如何绘制这些条形图

我想绘制这两张由 4 个条形图组成的图。 在此处输入图片描述

在此处输入图片描述

黑色矩形中的数字是它们的面积,但我很乐意手动输入这些值。

我认为 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}

相关内容