![将 ybar 间隔分隔符的宽度调整为直方图条的宽度](https://linux22.com/image/267989/%E5%B0%86%20ybar%20%E9%97%B4%E9%9A%94%E5%88%86%E9%9A%94%E7%AC%A6%E7%9A%84%E5%AE%BD%E5%BA%A6%E8%B0%83%E6%95%B4%E4%B8%BA%E7%9B%B4%E6%96%B9%E5%9B%BE%E6%9D%A1%E7%9A%84%E5%AE%BD%E5%BA%A6.png)
我有一个数字数组,我想为其前 22 个条目创建直方图。我想将数组的前几个条目显示为条形图,并将直方图显示为两个subfigures
。对于直方图,我尝试使用pgfplots
,ybar interval
并addplot+/table
从 pgfplots-manual 中的示例开始,然后根据我的数据进行调整。
我对输出的问题是间隔分隔符的宽度与直方图条的宽度不同。这导致条形标记看似错误,因为直方图的宽度不如轴宽。我尝试了以下尝试来解决问题,但没有成功:
- 使用
ybar
而不是ybar interval
-这会将刻度/标签移动到栏的左下方,而我希望它居中 - 未指定
xticks
-这会导致分隔符和直方图条的宽度相同,但标签会更改为奇怪的浮点数。
代码:
\documentclass{article}
\usepackage{pgfplots}
\usepackage{subcaption}
\begin{document}
\begin{figure}
\begin{subfigure}[b]{0.7\textwidth}
\centering
\begin{tikzpicture}
\begin{axis}[
ybar,
bar width=7pt,
height=5 cm,
width=13cm,
xtick={1,3,...,30},
ytick={1,3,...,13},
xlabel={Frames},
ylabel={Class}]
\addplot coordinates {
(1,12) (2,9) (3,1) (4,11) (5,11) (6,1) (7,1) (8,12) (9,1) (10,12)
(11,12) (12,12) (13,12) (14,12) (15,12) (16,12) (17,12) (18,12) (19,12) (20,12)
(21,12) (22,13) (23,1) (24,1) (25,1) (26,11) (27,1) (28,1) (29,1)
};
\end{axis}
\end{tikzpicture}
\end{subfigure}
\begin{subfigure}[b]{0.7\textwidth}
\centering
\begin{tikzpicture}
\begin{axis}[
ybar interval,
height=5 cm,
width=13cm,
xlabel=Class,
ylabel=Counts,
xtick={1,...,14},
]
\addplot+[hist={bins=13}]
table[row sep=\\,y index=0] {
data\\
12 \\9 \\1 \\11 \\11 \\1 \\1 \\12 \\1 \\12 \\
12 \\12 \\12 \\12 \\12 \\12 \\12 \\12 \\12 \\12 \\
12 \\13 \\
};
\end{axis}
\end{tikzpicture}
\end{subfigure}
\end{figure}
\end{document}
答案1
你应该做两件事:
删除
xtick
选项明确给出
data max
14。
诀窍在于不要将十三个箱子视为数字 1、2、...、13,而是将其视为半开区间 [1,2)、[2,3)、...、[13,14)。 这就是为什么需要data max
为 14,而不是 13。
结果:
修改后的代码:
\documentclass{article}
\usepackage{pgfplots}
\usepackage{subcaption}
\begin{document}
\begin{figure}
\begin{subfigure}[b]{0.7\textwidth}
\centering
\begin{tikzpicture}
\begin{axis}[
ybar,
bar width=7pt,
height=5cm,
width=13cm,
xtick={1,3,...,30},
ytick={1,3,...,13},
xlabel={Frames},
ylabel={Class}]
\addplot coordinates {
(1,12) (2,9) (3,1) (4,11) (5,11) (6,1) (7,1) (8,12) (9,1) (10,12)
(11,12) (12,12) (13,12) (14,12) (15,12) (16,12) (17,12) (18,12) (19,12) (20,12)
(21,12) (22,13) (23,1) (24,1) (25,1) (26,11) (27,1) (28,1) (29,1)
};
\end{axis}
\end{tikzpicture}
\end{subfigure}
\begin{subfigure}[b]{0.7\textwidth}
\centering
\begin{tikzpicture}
\begin{axis}[
ybar interval,
height=5cm,
width=13cm,
xlabel=Class,
ylabel=Counts,
%xtick={1,...,13},
]
\addplot+[hist={bins=13, data max=14}]
table[row sep=\\,y index=0] {
data\\
12 \\9 \\1 \\11 \\11 \\1 \\1 \\12 \\1 \\12 \\
12 \\12 \\12 \\12 \\12 \\12 \\12 \\12 \\12 \\12 \\
12 \\13 \\
};
\end{axis}
\end{tikzpicture}
\end{subfigure}
\end{figure}
\end{document}