
На моем графике я пытаюсь показать относительное значение рядом с абсолютными значениями. Например, для самого правого столбца я хотел бы, чтобы было 110 прямо под 9.02*10^6. Другой вариант — ось справа с «ускорением», которая идет от 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}