如何使用“ybar 间隔”而不跳过最后一个值

如何使用“ybar 间隔”而不跳过最后一个值

我有以下代码

\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepackage{filecontents}

\begin{filecontents}{testdata.dat}
  -3.316988309367815e-07 0.07000000000000001
  -1.948815911147526e-08 0.13
  7.15864175355987e-08 0
  1.799432483450127e-07 0
  0.0002850606647384129 0
  0.0009429559686380238 0.08999999999999997
  0.00157188462064142 0
  0.005259918700865051 0
  0.01739392641273605 0.18
  0.06208364670743995 0.55
  68.69485148165926 6.970000000000001
  31.217611224923 79.12
  0 12.89
\end{filecontents}

\pgfplotsset{compat=newest}
\pgfplotstableread{testdata.dat}\datatable

\begin{document}
\begin{tikzpicture}
\begin{axis}[
  ybar interval,
  width=10cm,
  height=5cm,
  enlargelimits=false, 
  xtick=data,
  ymin=0, ymax=100,
  xticklabels={0 -- 0.063,0.063 -- 0.125,0.125 -- 0.25,0.25 -- 0.5,0.5 -- 1,
               1 -- 2,2 -- 4,4 -- 5.6,5.6 -- 8,
               8 -- 11.2,11.2 -- 16,16 -- 22.4,22.4 -- 31.5},
  x tick label style={rotate=60,anchor=east}
  ]
  \addplot table[x expr=\coordindex,y=0]{\datatable};
  \addplot table[x expr=\coordindex,y=1]{\datatable}; 
\end{axis}
\end{tikzpicture}
\end{document}

输出如下:

在此处输入图片描述

但该命令ybar interval确实跳过了最后一个值。它应该看起来像:

在此处输入图片描述

我希望最后一个值显示在间隔内22.4 -- 31.5。如何在不向表中插入一行零的情况下实现此目的?

答案1

因为您想结合图表的不同方面,我想这里可以接受一点手工劳动。Jake 在上面的评论中提到了不使用 ybar 间隔的主要原因。最后一个数据点被丢弃,因为它后面没有任何内容,因此没有间隔。但是使用 ybar,您想实现与刻度标签定位相同的视觉效果,这是可能的。

但是,ybar会自动移动条形,使每个条形组都以刻度为中心。要覆盖它,您可以手动调整bar widthbar shift。然后可以通过shift={(<coord>)}

另外,您使用xtick= dataenlargelimits=false,这会使最后一个数据集消失,因为它会剪辑到最后一个刻度。相反,您可以设置轴限制。

\documentclass[border=4mm]{standalone}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.8}

\pgfplotstableread{
 -3.316988309367815e-07  0.07000000000000001
 -1.948815911147526e-08  0.13
  7.15864175355987e-08   0
  1.799432483450127e-07  0
  0.0002850606647384129  0
  0.0009429559686380238  0.08999999999999997
  0.00157188462064142    0
  0.005259918700865051   0
  0.01739392641273605    0.18
  0.06208364670743995    0.55
  68.69485148165926      6.970000000000001
  31.217611224923        79.12
  0                      12.89
}\datatable

\begin{document}
\begin{tikzpicture}
\begin{axis}[
  ybar,
  width=10cm,
  height=5cm,
  ymin=0, ymax=100,
  xmin=0, xmax=13,
  xticklabels={0 -- 0.063,0.063 -- 0.125,0.125 -- 0.25,0.25 -- 0.5,0.5 -- 1,
               1 -- 2,2 -- 4,4 -- 5.6,5.6 -- 8,
               8 -- 11.2,11.2 -- 16,16 -- 22.4,22.4 -- 31.5},
  x tick label style={shift={(axis cs:0.5,0)},anchor=east,rotate=60,},
  bar width=0.5,
  xtick={0,...,12},enlargelimits=false
  ]
  \addplot+[bar shift=0.25] table[x expr=\coordindex,y index=0]{\datatable};
  \addplot+[bar shift=0.75] table[x expr=\coordindex,y index=1]{\datatable}; 
\end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

小问题

  • pgfplotstable加载pgfplotsTikZ。所以一个就够了
  • 使用pgfplots您拥有的compat密钥版本,而不是newest
  • 考虑对数图,因为大部分数据实际上是不可见的。

相关内容