pgfplots: по строке, ранжирование определенного столбца

pgfplots: по строке, ранжирование определенного столбца

У меня есть набор данных, в котором строки указывают годы, а столбцы — фирмы. Для каждого года я хочу построить график рейтинга первой фирмы по отношению к остальным.

В примере ниже 2013 год делит 5-е место (если это слишком сложно, я могу разорвать округление), поскольку ячейки с 1 по 8 (например, ячейка 0) в строке 2013 года упорядочены следующим образом: 0,67 (F3; 1-е) > 0,54 (F6; 2-е) > 0,48 (F2; 3-е) > 0,46 (F8; 4-е) > 0,38 (F1 и F4; совместное 5-е). Начиная с 2014 года, F1 занимает 6-е место.

\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}

Ниже представлена ​​закодированная вручную версия желаемого мной результата.

граф, закодированный вручную

решение1

Итак, вы ищете что-то вроде следующего? Надеюсь, это само собой разумеется...

% 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}

изображение, показывающее результат кода выше

Связанный контент