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,以使末端的条位于轴内。
\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}