如何调节条形图上方数字的小数?

如何调节条形图上方数字的小数?

我正在使用 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\pgfplotspointmeta1Y4.9e-2]\ifdimfpu\pgfmathparse10fpu\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}

相关内容