pgfplots-显示绝对值和相对值

pgfplots-显示绝对值和相对值

在我的图中,我试图在绝对值旁边显示相对值。例如,对于最右边的列,我希望它在 9.02*10^6 的正下方显示 110。另一个选项是向右显示一个轴,其“加速”范围从 1 到 110。

另外,我怎样才能将图向下移动,以便条形图从 x 轴线开始?

\begin{tikzpicture}
\begin{axis}[
    ybar,
        scale=0.9,
        axis x line= bottom,
        axis y line = left,
        x post scale = 1.5,
        enlargelimits=0.15,
        anchor=west,
        ylabel=Rays/second,
        symbolic x coords={Original, Linear Traverser, MT Linear Traverser, CPU kd-tree, GPU kd-tree},
        xtick=data,
        nodes near coords, 
        nodes near coords align={vertical},
        x tick label style={rotate=45,anchor=east, xshift=-0.1em, yshift=-0.01em},
]
\addplot coordinates {(Original, 81685) (Linear Traverser, 506326) (MT Linear Traverser, 1754330)
    (CPU kd-tree, 1873746) (GPU kd-tree, 9023256)};
\end{axis}
\end{tikzpicture}

示例图像

答案1

首先,我建议以表格形式提供数据,而不是以坐标列表形式提供。这样可以更轻松地操作值,并且允许您使用文件中的数据。此外,我通常更喜欢使用数字索引来表示 x 位置,而不是symbolic x coords。您可以x expr=\coordindex\addplot table [...]选项中使用来动态生成这些,并且可以使用键将数据中的文本用作刻度标签xticklabels from file。这样,如果您决定更改标签,则只需在一个位置更改它们即可。

\datatable如果您已将数据表读入使用命令调用的宏中\pgfplotstableread,则可以使用以下命令创建一个包含相对值的新列

% Get base value
\pgfplotstablegetelem{0}{Value}\of\datatable
% Calculate relative values
\pgfplotstablecreatecol[
    create col/expr={
        \thisrow{Value}/\pgfplotsretval*100
    }
]{Relative}{\datatable}

为了使这些值除了nodes near coords绝对值之外还可用,您可以使用键visualization depends on=\thisrow{Relative} \as \relativevalue。然后可以使用 访问这些值\relativevalue。不幸的是,这仅在直接从数据文件而不是从表宏创建图时才有效。这里最简单的方法是将新数据表(包含新列Relative)存储到临时文件中,使用\pgfplotstablesave[col sep=comma]{\datatable}{temptable.txt}col sep=comma这是必要的,因为文本标签中有空格)。

然后,您可以设置nodes near coords显示这两个值。我曾经siunitx对数字进行四舍五入和格式化:

nodes near coords={%
    \pgfmathfloattofixed{\pgfplotspointmeta}%
    \num[round-mode=figures, round-precision=2]{\pgfmathresult}\\%
    \SI[round-mode=figures, round-precision=2]{\relativevalue}{\percent}%
}

要使绘图从 y 轴开始,您可以设置enlarge y limits=upper, ymin=0

所有这些产生了以下情节:

\documentclass{article}
\usepackage{pgfplots, pgfplotstable}
\pgfplotsset{compat=1.7}
\usepackage{siunitx}

\begin{document}

\pgfplotstableread{
Name Value
Original 81685
{Linear Traverser} 506326
{MT Linear Traverser} 1754330
{CPU kd-tree} 1873746
{GPU kd-tree} 9023256
}\datatable

% Get base value
\pgfplotstablegetelem{0}{Value}\of\datatable
% Calculate relative values
\pgfplotstablecreatecol[
    create col/expr={
        \thisrow{Value}/\pgfplotsretval*100
    }
]{Relative}{\datatable}

\pgfplotstablesave[col sep=comma]{\datatable}{temptable.txt}

\begin{tikzpicture}
\begin{axis}[
        ybar,
        scale=0.9,
        axis x line= bottom,
        axis y line = left,
        x post scale = 1.5,
        enlargelimits=0.15,
        enlarge y limits=upper, ymin=0,
        anchor=west,
        ylabel=Rays/second,
        xticklabels from table={\datatable}{Name},
        xtick=data, ytick=\empty,
        visualization depends on=\thisrow{Relative}\as\relativevalue,
        nodes near coords={%
            \pgfmathfloattofixed{\pgfplotspointmeta}%
            \num[round-mode=figures, round-precision=2]{\pgfmathresult}\\%
            \SI[round-mode=figures, round-precision=2]{\relativevalue}{\percent}%
        },
        nodes near coords align={vertical},
        every node near coord/.append style={align=center},
        x tick label style={rotate=45,anchor=east, xshift=-0.1em, yshift=-0.01em},
]
\addplot [fill=gray] table [x expr=\coordindex, col sep=comma] {temptable.txt};
\end{axis}
\end{tikzpicture}
\end{document}

相关内容