使用年份作为月度数据直方图的标签

使用年份作为月度数据直方图的标签

year我有、month和格式的数据amount。我想使用直方图来说明这些数据。由于数据涵盖多年,打印月份只会堆叠所有内容。我尝试使用年份作为标签和年份划分网格。

目前的解决方案:

\begin{tikzpicture}
\begin{axis}[
    ybar stacked,
    width=1.1\textwidth,
    height=\axisdefaultheight,
    bar width=7pt,
    grid=both,
    enlarge x limits=false,
    enlarge y limits=upper,
    xtick=data,     
    xticklabels={2013,2014,2015,2016,2017},
    ymin=0
]
    \addplot[ybar,fill=gray] coordinates {
        (1,7)(2,5)(3,5)(4,7)(5,2)(6,4)(7,12)(8,0)(9,2)(10,6)(11,0)(12,0)(13,0)(14,2)(15,5)(16,0)(17,2)(18,6)(19,1)(20,0)(21,8)(22,10)(23,2)(24,21)(25,9)(26,4)(27,6)(28,32)(29,10)(30,10)(31,24)(32,44)(33,51)(34,43)(35,29)(36,39)(37,27)(38,12)(39,0)(40,9)(41,21)(42,7)(43,32)(44,1)(45,14)(46,22)(47,1)(48,23)(49,3)(50,13)(51,15)(52,23)(53,5)(54,16)(55,9)(56,28)(57,2)(58,26)(59,10)(60,0)
    };
\end{axis}
\end{tikzpicture}

其结果为:

混乱的网格标签和网格

我尝试了一些奇怪的解决方案,使用大量空逗号和手绘线条来以某种方式得到我想要的东西。

目标

但正如您所见,居中标签很难(并且对于其他范围可能会失败)。那么,您知道如何做吗:

  • 按年份创建垂直网格(每 12 个条目)
  • 使用居中的年份标签
  • 奖励:删除顶部和底部 x 轴的其他(小)网格虚线(可选!)

答案1

一个选项可能是每 6 个月、18 个月等添加一个勾选,

xtick={6,18,...,60},

然后计算一个新值用于标签

xticklabel={\pgfmathparse{(\tick-6)/12+2013}\pgfmathprintnumber{\pgfmathresult}},

注意xticklabel而不是xticklabels。这允许您根据刻度的数据值定义刻度标签的模式,该模式由 给出\tick。减去六并除以十二可得出从开始的年份,加上 2013 可得到正确的年份。

此外,添加

xticklabel style={/pgf/number format/1000 sep=},

删除默认用于分隔千位的逗号。

另外两个小变化:

  • bar width=1使每个条形图的宽度为一个轴单位(即一个月)。这需要您启用compat=1.7或更高的版本号。我在下面的示例中添加了 1.18,因为这是我安装的版本,如果您有该软件包的某些旧版本,则必须对其进行修改。

  • enlarge x limits={abs=0.5}在轴的每一端添加 0.5,以使末端的条位于轴内。

ode 的输出

\documentclass[border=5mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\begin{document}
    
\begin{tikzpicture}
\begin{axis}[
    ybar stacked,
    width=1.1\textwidth,
    height=\axisdefaultheight,
    bar width=1, % with compat=1.7 or newer, a number without a unit is interpreted as axis units
    grid=both,
    enlarge y limits=upper,
    xtick={6,18,...,60},
    xticklabel={\pgfmathparse{(\tick-6)/12+2013}\pgfmathprintnumber{\pgfmathresult}},
    xticklabel style={/pgf/number format/1000 sep=},
    ymin=0,
    enlarge x limits={abs=0.5}
]
    \addplot[ybar,fill=gray] coordinates {
        (1,7)(2,5)(3,5)(4,7)(5,2)(6,4)(7,12)(8,0)(9,2)(10,6)(11,0)(12,0)(13,0)(14,2)(15,5)(16,0)(17,2)(18,6)(19,1)(20,0)(21,8)(22,10)(23,2)(24,21)(25,9)(26,4)(27,6)(28,32)(29,10)(30,10)(31,24)(32,44)(33,51)(34,43)(35,29)(36,39)(37,27)(38,12)(39,0)(40,9)(41,21)(42,7)(43,32)(44,1)(45,14)(46,22)(47,1)(48,23)(49,3)(50,13)(51,15)(52,23)(53,5)(54,16)(55,9)(56,28)(57,2)(58,26)(59,10)(60,0)
    };
\end{axis}
\end{tikzpicture}
    
\end{document}

相关内容