
No meu gráfico estou tentando mostrar o valor relativo próximo aos valores absolutos. Por exemplo, para a coluna mais à direita, gostaria de dizer 110 logo abaixo de 9,02*10^6. Outra opção seria um eixo para a direita com “speedup” que vai de 1 a 110.
Além disso, como posso mover o gráfico para baixo para que as barras comecem logo na linha do eixo 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}
Responder1
Em primeiro lugar, recomendo fornecer os dados na forma de uma tabela, não como uma lista de coordenadas. Isso torna muito mais fácil manipular os valores e permite usar dados de um arquivo. Além disso, geralmente prefiro usar índices numéricos para a posição x em vez de symbolic x coords
. Você pode usar x expr=\coordindex
as \addplot table [...]
opções para gerá-los dinamicamente e pode usar o texto dos seus dados como rótulos de escala usando a tecla xticklabels from file
. Dessa forma, se você decidir alterar os rótulos, precisará alterá-los apenas em um único local.
Se você leu sua tabela de dados em uma macro chamada \datatable
usando o \pgfplotstableread
comando, você pode criar uma nova coluna contendo os valores relativos usando
% Get base value
\pgfplotstablegetelem{0}{Value}\of\datatable
% Calculate relative values
\pgfplotstablecreatecol[
create col/expr={
\thisrow{Value}/\pgfplotsretval*100
}
]{Relative}{\datatable}
Para disponibilizar esses valores em seu nodes near coords
além dos valores absolutos, você pode usar a chave visualization depends on=\thisrow{Relative} \as \relativevalue
. Os valores podem então ser acessados usando \relativevalue
. Infelizmente, isso só funciona se o gráfico for criado diretamente a partir de um arquivo de dados e não de uma macro de tabela. A coisa mais fácil de fazer aqui é armazenar a nova tabela de dados (que contém a nova Relative
coluna) em um arquivo temporário, usando \pgfplotstablesave[col sep=comma]{\datatable}{temptable.txt}
( col sep=comma
é necessário devido aos espaços nos rótulos de texto).
Então você pode configurar nodes near coords
para mostrar os dois valores. Eu costumava siunitx
arredondar e formatar os números:
nodes near coords={%
\pgfmathfloattofixed{\pgfplotspointmeta}%
\num[round-mode=figures, round-precision=2]{\pgfmathresult}\\%
\SI[round-mode=figures, round-precision=2]{\relativevalue}{\percent}%
}
Para fazer o gráfico começar no eixo y, você pode definir enlarge y limits=upper, ymin=0
.
Tudo isso resulta no seguinte gráfico:
\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}