
En mi gráfico estoy tratando de mostrar el valor relativo junto a los valores absolutos. Por ejemplo, para la columna de la derecha, me gustaría que dijera 110 justo debajo de 9,02*10^6. Otra opción sería un eje a la derecha con "aceleración" que vaya de 1 a 110.
Además, ¿cómo puedo mover el gráfico hacia abajo para que las barras comiencen justo en la línea del eje 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}
Respuesta1
En primer lugar, recomendaría proporcionar los datos en forma de tabla, no como lista de coordenadas. Eso hace que sea mucho más fácil manipular los valores y le permite utilizar datos de un archivo. Además, generalmente prefiero usar índices numéricos para la posición x en lugar de symbolic x coords
. Puede utilizar x expr=\coordindex
las \addplot table [...]
opciones para generarlos sobre la marcha y puede utilizar el texto de sus datos como etiquetas de marca utilizando la tecla xticklabels from file
. De esa manera, si decide cambiar las etiquetas, solo necesitará modificarlas en una única ubicación.
Si ha leído su tabla de datos en una macro llamada \datatable
usando el \pgfplotstableread
comando, puede crear una nueva columna que contenga los 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 que estos valores estén disponibles en su nodes near coords
además de los valores absolutos, puede usar la clave visualization depends on=\thisrow{Relative} \as \relativevalue
. Luego se puede acceder a los valores usando \relativevalue
. Desafortunadamente, esto sólo funciona si el gráfico se crea directamente desde un archivo de datos, no desde una macro de tabla. Lo más fácil de hacer aquí es almacenar la nueva tabla de datos (que contiene la nueva Relative
columna) en un archivo temporal, usando \pgfplotstablesave[col sep=comma]{\datatable}{temptable.txt}
( col sep=comma
es necesario debido a los espacios en las etiquetas de texto).
Luego puede configurarlo nodes near coords
para que muestre ambos valores. Solía siunitx
redondear y formatear los 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 hacer que el gráfico comience desde el eje y, puede configurar enlarge y limits=upper, ymin=0
.
Todo eso da como resultado la siguiente trama:
\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}