将 ybar 间隔分隔符的宽度调整为直方图条的宽度

将 ybar 间隔分隔符的宽度调整为直方图条的宽度

我有一个数字数组,我想为其前 22 个条目创建直方图。我想将数组的前几个条目显示为条形图,并将直方图显示为两个subfigures。对于直方图,我尝试使用pgfplotsybar intervaladdplot+/table从 pgfplots-manual 中的示例开始,然后根据我的数据进行调整。

在此处输入图片描述

我对输出的问题是间隔分隔符的宽度与直方图条的宽度不同。这导致条形标记看似错误,因为直方图的宽度不如轴宽。我尝试了以下尝试来解决问题,但没有成功:

  1. 使用ybar而不是ybar interval-这会将刻度/标签移动到栏的左下方,而我希望它居中
  2. 未指定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 max14。

诀窍在于不要将十三个箱子视为数字 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}

相关内容