pgfplots: por fila, clasificando una columna particular

pgfplots: por fila, clasificando una columna particular

Tengo un conjunto de datos en el que las filas indican años y las columnas empresas. Para cada año, quiero trazar la clasificación de la primera empresa frente a las demás.

En el siguiente ejemplo, 2013 está empatado en el quinto lugar (si esto es demasiado complicado, puedo romper el redondeo) ya que las celdas 1 a 8 (por ejemplo, la celda 0) en la fila de 2013 están ordenadas: 0,67 (F3; 1°) > 0,54 ( F6; 2º) > 0,48 (F2; 3º) > 0,46 (F8; 4º) > 0,38 (F1 y F4; articulación 5º). A partir de 2014, la F1 ocupa el sexto lugar.

\documentclass{article}
\usepackage{pgfplotstable}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}

\begin{document}

\pgfplotstableread[col sep=tab,row sep=\\,header=false]{
  % year    F1      F2      F3      F4      F5      F6      F7      F8
  2013  0.38    0.48    0.67    0.38    0.34    0.54    0.32    0.46 \\
  2014  0.37    0.48    0.70    0.39    0.34    0.54    0.31    0.50 \\
  2015  0.35    0.44    0.68    0.38    0.30    0.53    0.28    0.49 \\
  2016  0.33    0.43    0.67    0.35    0.29    0.51    0.29    0.47 \\
}\datatable

\begin{tikzpicture}
  \begin{axis}[
    ylabel = rank, y dir = reverse,
  ]

  \addplot table [x expr=\coordindex, y expr= % what goes here? 
    ] {\datatable};

  \end{axis}
\end{tikzpicture}

\end{document}

A continuación se muestra una versión codificada a mano del resultado que deseo.

gráfico codificado a mano

Respuesta1

¿Entonces estás buscando algo como lo siguiente? Esperemos que esto se explique por sí mismo...

% used PGFPlots v1.16
\documentclass[border=5pt]{standalone}
\usepackage{pgfplotstable}
    \pgfplotsset{
        compat=1.3,
        /pgf/declare function={
            MyRank(\a,\b,\c,\d,\e,\f,\g,\h) =
                ifthenelse( \a == min(\a,\b,\c,\d,\e,\f,\g,\h), 1,
                ifthenelse( \b == min(\a,\b,\c,\d,\e,\f,\g,\h), 2,
                ifthenelse( \c == min(\a,\b,\c,\d,\e,\f,\g,\h), 3,
                ifthenelse( \d == min(\a,\b,\c,\d,\e,\f,\g,\h), 4,
                ifthenelse( \e == min(\a,\b,\c,\d,\e,\f,\g,\h), 5,
                ifthenelse( \f == min(\a,\b,\c,\d,\e,\f,\g,\h), 6,
                ifthenelse( \g == min(\a,\b,\c,\d,\e,\f,\g,\h), 7,
                8)))))));
        },
    }
    % (please note that I have changed the first value of F5)
    \pgfplotstableread{
        year    F1      F2      F3      F4      F5      F6      F7      F8
        2013  0.38    0.48    0.67    0.38    0.30    0.54    0.32    0.46
        2014  0.37    0.48    0.70    0.39    0.34    0.54    0.31    0.50
        2015  0.35    0.44    0.68    0.38    0.30    0.53    0.28    0.49
        2016  0.33    0.43    0.67    0.35    0.29    0.51    0.29    0.47
    }\datatable
\begin{document}
\begin{tikzpicture}
    \begin{axis}[
        ylabel=rank,
        y dir=reverse,
        xtick distance=1,
        ytick distance=1,
    ]
        \addplot table [
            x expr=\coordindex,
            y expr={
                MyRank(
                    \thisrow{F1},
                    \thisrow{F2},
                    \thisrow{F3},
                    \thisrow{F4},
                    \thisrow{F5},
                    \thisrow{F6},
                    \thisrow{F7},
                    \thisrow{F8}
                )
            }
        ] {\datatable};
    \end{axis}
\end{tikzpicture}
\end{document}

imagen que muestra el resultado del código anterior

información relacionada