我正在尝试制作分类数据的条形图,其中每个类别都有一个分数,并且类别中的项目数由条形的宽度表示。基于来自 CSV 文件的条形图,条宽可调我尝试使用以下命令在 x 轴上添加类别标签xticklabels from table
:
\documentclass[border=5mm]{standalone}
\usepackage{filecontents}
\usepackage{pgfplots, pgfplotstable}
\begin{filecontents}{data.csv}
name height width
foo 1 884
bar 2 5768
baz 3 835
qux 7 2661
quux 10 492
corge 11 1349
clyde 11 0
\end{filecontents}
\begin{document}
\begin{tikzpicture}
\begin{axis}[xticklabels from table={data.csv}{name},
typeset ticklabels with strut
]
\addplot [ybar interval, fill=yellow] table [
create on use/xaccum/.style={
create col/expr=\pgfmathaccuma+\prevrow{width}
},
x=xaccum, y=height
] {data.csv};
\end{axis}
\end{tikzpicture}
\end{document}
但是,此解决方案并未将 xticklabels 与条形图对齐:
我正在考虑添加一个extra description
节点或extra x tick
,或者在绘图后使用一个额外的循环来根据新的“xaccum”列添加节点,但我不确定如何实现这样的事情。
附加问题:如何删除 10e4?
也欢迎其他解决方案(带或不带 pgfplots)。原则上,我可以根据需要预先计算或修改数据(使用 LaTeX 或其他方式)。一个例子是(自动)在窄条之前和之后添加零高度无标签行,以防止标签重叠。
答案1
这不是一个完美的解决方案,但如果您想保持条宽显示作为节点重复的“某些东西”,希望这是一个好的开始。
有关详细信息,请查看代码中的注释。
% PGFPlots v1.15
\begin{filecontents}{data.csv}
name height width
foo 1 884
bar 2 5768
baz 3 835
qux 7 2661
quux 10 492
corge 11 1349
clyde 11 0
\end{filecontents}
\documentclass[border=5pt]{standalone}
\usepackage{filecontents}
\usepackage{pgfplots, pgfplotstable}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
xticklabels from table={data.csv}{name},
typeset ticklabels with strut,
% to align the `xticklabels` properly
% (although they overlap now)
xtick=data,
% to remove the "10^4"
scaled ticks=false,
% to add nodes with the `width' value
nodes near coords,
point meta=explicit,
]
\addplot [ybar interval, fill=yellow] table [
create on use/xaccum/.style={
create col/expr=\pgfmathaccuma+\prevrow{width}
},
x=xaccum,
y=height,
meta=width, % <-- also added to display the `width' value
] {data.csv};
\end{axis}
\end{tikzpicture}
\end{document}