[Tex/LaTex] Mark nodes/coordinates by label (PGFPlots)

nodes-near-coordspgfplots

I am drawing a scatterplot, where the data is in a table and the values are labeled. I want to connect certain nodes with straight lines and in order to do so, one has to label the nodes/coordinates.

I must say that I have a working solution, but am unhappy with the implementation as it is IMO redundant.

My current code for the scatterplot is the following:

\begin{tikzpicture}
\begin{axis}[
    width=9cm,
]

\addplot[
    scatter,
    black,
    nodes near coords,
    only marks,
    point meta=explicit symbolic,
    mark=o,
] table[
    x=cpu,
    y=error,
    meta=label,
] {
    cpu     error   label
    0.45    0.20    A
    0.35    0.28    B
    0.27    0.30    C
    0.33    0.23    Č
    0.25    0.40    D
    0.33    0.35    E
    0.40    0.35    F

}
    % pos = (index-1)/(N-1)  (index starting from 1)
    coordinate [pos=0/6] (A)
    coordinate [pos=2/6] (C)
    coordinate [pos=3/6] (Č)
    coordinate [pos=4/6] (D)
;

\draw (D) -- (C);
\draw (C) -- (Č);
\draw (Č) -- (A);

\end{axis}
\end{tikzpicture}

And the plot renders like this:

scatterplot rendering

The part of the code that I find redundant is the following:

coordinate [pos=0/6] (A)
coordinate [pos=2/6] (C)
coordinate [pos=3/6] (Č)
coordinate [pos=4/6] (D)

My question is the following: Is there a way to reference to the labels directly when I use \draw (D) -- (C);?

Best Answer

This can be done, but it is the question if this is more elegant than your already provided solution.

For more details on how this can be done, please have a look at the comments in the code.

% used PGFPlots v1.14
\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
    \begin{axis}[
        only marks,
        % we want to add `nodes near coords', but this time a bit different than
        % usual. We want to place the node name *to the "marker"* and not to
        % the "normal" `node near coords'. That means the "main" node of the
        % `nodes near coords' shall not show anything
        nodes near coords={},
        % and now we adapt the `nodes near coords style' to our needs
        nodes near coords style={
            % we only need `coordinate' style for the `nodes near coords'
            coordinate,
            % and add a label to the "main" node which shows the `point meta' data
            label={above:\pgfplotspointmeta},
            % in addition we want to name the `nodes near coords' also with
            % the `point meta' data
            name=\pgfplotspointmeta,
        },
        % !!! now comes a critical point !!!
        % Option a)
        % to make that solution work you have set the following option due to
        % technical reasons which is roughly:
        % normally the markers are first collected and are drawn *after*
        % `\end{axis}', in contrast to the `\draw' command. Said that, the
        % named `nodes near coords' are not available during the execution of
        % the `\draw' command
        clip marker paths=true,
        point meta=explicit symbolic,
    ]
        \addplot[
            scatter,
            mark=o,
        ] table [
            x=cpu,
            y=error,
            meta=label,
        ] {
            cpu     error   label
            0.45    0.20    A
            0.35    0.28    B
            0.27    0.30    C
            0.33    0.23    Č
            0.25    0.40    D
            0.33    0.35    E
            0.40    0.35    F
        }
%% the idea is to replace this here ...
%            % pos = (index-1)/(N-1)  (index starting from 1)
%            coordinate [pos=0/6] (A)
%            coordinate [pos=2/6] (C)
%            coordinate [pos=3/6] (Č)
%            coordinate [pos=4/6] (D)
        ;

        % option a)
        \draw (D) -- (C) -- (Č) -- (A);

    \end{axis}

    % option b)
    % the other option -- so when `clip marker path=false' (the default) -- is
    % to draw the connecting line after `\end{axis}', because now the named
    % `nodes near coords' are available
    \draw (D) -- (C) -- (Č) -- (A);

\end{tikzpicture}
\end{document}

image showing the result of above code

Related Question