我正在使用 latex 包“pgfplots”来生成 x-barplots。在这些图中,每个条形的高度都以数字的形式放置在条形的右侧,如下所示:
生成这些条形图的代码如下。此代码中包含一个带有 x 和 y 数字的数据文件,称为“data1.dat”。我关心的是如何调节图中显示的小数位数。例如,在数据文件中,y 值 1 的 x 值为 15.1234,但这个数字在图中显示为“15.12”。更具体地说:
(1)如何将小数位数设置为特定值,例如一位?
(2)如果我想要一位小数,如何才能避免将 0.049 写成 4.9*10-2,而是写成“0.0”?
(3)如何让 12.0 写成“12.0”而不是图中的“12”?
(4)是否可以将数据文件中的 0.049 与“<0.05”交换,以便图中显示“<0.05”?
\documentclass{article}
\usepackage{pgfplots}
\usepackage{filecontents}
\pgfplotsset{
compat=newest,
width=6cm,
height=4cm,
xtick align =outside,
xtick pos = both,
xticklabel pos =lower,
xmin=-5,
xmax = 105,
ytick align = outside,
ytick pos = left,
yticklabel pos=left,
ymin =0,
ymax = 5,
ytick=data,
xbar,
nodes near coords,
every node near coord/.append style = {anchor=west},
}
\begin{document}
% Measurements
\begin{filecontents}{data1.dat}
yvalue xvalue
1 15.1234
2 20.5678
3 12.0
4 0.049
\end{filecontents}
\begin{tikzpicture}
\begin{axis}[
yticklabels from table={data1.dat}{yvalue},
xlabel = {x},
ylabel = {y},
every axis y label/.style = {at={(yticklabel cs:0.5)}, rotate=0,anchor =east},
bar width=4pt,
]
\addplot table [
y=yvalue,
x=xvalue,
] {data1.dat};
\end{axis}
\end{tikzpicture}
\end{document}
答案1
正如 percusse 在评论中所说,您可以通过/pgf/number format/fixed, /pgf/number format/precision=1
在 中设置来强制使用指定精度的定点表示法every node near coord/.append style
。为了确保始终有一个小数点,即使它是零,您还需要添加/pgf/number format/fixed zerofill
。
最后一个请求比较棘手,在这里您需要测试该值,然后决定如何处理它。使用可选参数 最容易做到这一点nodes near coords
。默认情况下,此值为nodes near coords=\pgfmathprintnumber{\pgfplotspointmeta}
,其中\pgfmathprintnumber
负责应用我们指定的所有格式选项,并\pgfplotspointmeta
包含meta
,默认为绘图x
中的值xbar
,或y
大多数其他绘图类型中的值。
我们想要做的是检查是否\pgfplotspointmeta
小于,如果是则0.05
打印字符串,否则打印字符串。直观的做法是使用,但这样做不起作用,因为包含一个浮点数(看起来像),导致出错。这里最好的方法是打开库(它的数字范围比纯 LaTeX 算术大得多),使用进行比较,将比较结果(要么是或)转换为“正常”定点数,关闭库(否则以后会出现问题),然后使用转换后的比较结果。$<0.05$
\pgfmathprintnumber{\pgfplotspointmeta}
\ifdim\pgfplotspointmeta pt<0.05pt ... \else ... \fi
\pgfplotspointmeta
1Y4.9e-2]
\ifdim
fpu
\pgfmathparse
1
0
fpu
\ifdim
所以如果你使用
nodes near coords={%
\pgfkeys{/pgf/fpu=true}% Switch on the fpu library
\pgfmathparse{\pgfplotspointmeta<0.05}% Do the comparison
\pgfmathfloattofixed{\pgfmathresult}% convert the result to fixed point
\pgfkeys{/pgf/fpu=false}% switch off the fpu library
\ifdim\pgfmathresult pt=1pt % If the condition was true...
$<0.05$
\else
\pgfmathprintnumber{\pgfplotspointmeta}
\fi
}
你会得到
以下是完整代码
\documentclass{article}
\usepackage{pgfplots}
\usepackage{filecontents}
\pgfplotsset{
compat=newest,
width=6cm,
height=4cm,
xtick align =outside,
xtick pos = both,
xticklabel pos =lower,
xmin=-5,
xmax = 105,
ytick align = outside,
ytick pos = left,
yticklabel pos=left,
ymin =0,
ymax = 5,
ytick=data,
xbar,
nodes near coords={%
\pgfkeys{/pgf/fpu=true}%
\pgfmathparse{\pgfplotspointmeta<0.05}%
\pgfmathfloattofixed{\pgfmathresult}%
\pgfkeys{/pgf/fpu=false}%
\ifdim\pgfmathresult pt=1pt
$<0.05$
\else
\pgfmathprintnumber{\pgfplotspointmeta}
\fi
},
every node near coord/.append style = {
anchor=west,
/pgf/number format/.cd,
fixed,
fixed zerofill,
precision=1,
},
}
\begin{document}
% Measurements
\begin{filecontents}{data1.dat}
yvalue xvalue
1 15.1234
2 20.5678
3 12.0
4 0.049
\end{filecontents}
\begin{tikzpicture}
\begin{axis}[
yticklabels from table={data1.dat}{yvalue},
xlabel = {x},
ylabel = {y},
every axis y label/.style = {at={(yticklabel cs:0.5)}, rotate=0,anchor =east},
bar width=4pt,
]
\addplot table [
y=yvalue,
x=xvalue,
] {data1.dat};
\end{axis}
\end{tikzpicture}
\end{document}