在我的图中,我试图在绝对值旁边显示相对值。例如,对于最右边的列,我希望它在 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}