我正在使用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}