pgfplots: muestra el valor absoluto y relativo

pgfplots: muestra el valor absoluto y relativo

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}

Imagen de ejemplo

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=\coordindexlas \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 \datatableusando el \pgfplotstablereadcomando, 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 coordsademá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 Relativecolumna) en un archivo temporal, usando \pgfplotstablesave[col sep=comma]{\datatable}{temptable.txt}( col sep=commaes necesario debido a los espacios en las etiquetas de texto).

Luego puede configurarlo nodes near coordspara 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}

información relacionada