根据给定的条形宽度创建 ybar 间隔

根据给定的条形宽度创建 ybar 间隔

我正在使用NASA 任务负荷指数,它给出了 6 个尺度,并且每个尺度都有一个权重。我试图使用 ybar 间隔图绘制每个尺度的平均值,其中每个条形的宽度由相应尺度的权重设置,类似于下面从手册中截取的图片。

期望输出

我已设法创建一个附加列,它应该能给我正确的间隔数据(见表格),但条形宽度看起来不正确,而且我也无法使用符号 x 坐标作为条形的标签。

\documentclass{article}

\usepackage{pgfplots}
\usepackage{pgfplotstable}

\begin{document}

\pgfplotstableread{
  Scale    Mean  Weight
  MD      53.25    3.50
  PD      12.22    1.50
  TD      18.46    1.75
  FR      45.75    3.00
  OP      59.18    2.45
  EF      22.15    2.80
  Overall 38.175   2.50
}{\tlxweightedratings}

\pgfplotstabletypeset[
  columns/Scale/.style={string type},
  create on use/Interval/.style={
    create col/expr={\pgfmathaccuma + \thisrow{Weight}}},
  columns={Scale, Mean, Weight, Interval},
]{\tlxweightedratings}

\begin{tikzpicture}
  \begin{axis}[ybar interval, xtick=data,
      nodes near coords,
      %symbolic x coords={MD, PD, TD, FR, OP, EF, Overall},
  ]
    \addplot+ table[x=Interval, y=Mean,
      create on use/Interval/.style={
        create col/expr={\pgfmathaccuma + \thisrow{Weight}}},
    ] {\tlxweightedratings};
  \end{axis}
\end{tikzpicture}
\end{document}

答案1

绘图ybar interval样式使用x当前数据点的值作为列的左边缘,使用x下一个数据点的值作为列的右边缘。使用计算 的方法Interval,第一列从 开始3.5并延伸到5,因此其宽度为1.5。但是,您希望它从 开始0并延伸到3.5,因此您应该将代码更改为使用\prevrow而不是\thisrow。您还需要在表中添加一个虚拟数据行,这样最后一列的宽度也可以计算出来。

实际上你不需要symbolic x coordinates,因为它们总是等距的。只需使用xticklabels={MD, ...来设置标签即可。

nodes near coordinates目前无法令人满意地与 配合使用ybar interval,因为它们总是位于列的起点之上,而不是其中心。

\documentclass{article}

\usepackage{pgfplots}
\usepackage{pgfplotstable}

\begin{document}

\pgfplotstableread{
  Scale    Mean  Weight
  MD      53.25    3.50
  PD      12.22    1.50
  TD      18.46    1.75
  FR      45.75    3.00
  OP      59.18    2.45
  EF      22.15    2.80
  Overall 38.175   2.50
  Dummy    0       0
}{\tlxweightedratings}

\pgfplotstabletypeset[
  columns/Scale/.style={string type},
  create on use/Interval/.style={
    create col/expr={\pgfmathaccuma + \thisrow{Weight}}},
  columns={Scale, Mean, Weight, Interval},
]{\tlxweightedratings}

\begin{tikzpicture}
  \begin{axis}[
    ymin=0,
    ybar interval, xtick=data,
      xticklabels={MD, PD, TD, FR, OP, EF, Overall},
  ]
    \addplot+ table[x=Interval, y=Mean,
      create on use/Interval/.style={
        create col/expr={\pgfmathaccuma + \prevrow{Weight}}},
    ] {\tlxweightedratings};
  \end{axis}
\end{tikzpicture}
\end{document}

相关内容