Pgfplots: Diskrete statt verbundene Werte

Nov 01 2020

Ich habe eine Tabelle mit experimentellen Daten. Die Tabelle enthält zwei durch ein Semikolon getrennte Spalten. Die erste Spalte ist der Wert für die x-Achse und die zweite Spalte ist der Wert für die y-Achse.

Wenn ich den allgemeinen \addplot table {}Befehl verwende, pgfplotszeichnet er ein Diagramm, in dem die Punkte miteinander verbunden werden. Da es sich bei den fraglichen Datenpunkten um diskrete Werte handelt, sollte keine Verbindung zwischen ihnen bestehen, sondern jeder Punkt sollte unabhängig gezeichnet werden.

Was ist der richtige Ansatz dafür pgfplots?

Vom \addplot table {}Befehl erzeugte Ausgabe

\documentclass{article}

\usepackage{pgfplots}
\pgfplotsset{compat = 1.17}
\usepackage{siunitx}

\begin{filecontents}{table.csv}
    57.7200;403.7083
    81.1200;359.9954
    83.7600;2673.1575
    84.4800;201.8542
    95.7600;359.9954
    104.6400;403.7083
    104.8800;2673.1575
    105.0000;5146.4829
    105.1200;11393.4863
    105.2400;5706.3101
    105.9600;201.8542
    106.9200;4277.3057
    107.2800;359.9954
    107.4000;682.9842
    107.8800;2673.1575
    108.0000;403.7083
    108.3600;2673.1575
    108.6000;201.8542
    109.2000;47.6190
    109.4400;3883.1460
    109.9200;4081.7891
    110.0400;1113.2275
\end{filecontents}


\begin{document}

\begin{tikzpicture}
    
    \begin{axis}[
        xlabel = {\textit{m/z}},
        ylabel = {Int. [\si{cps}]},
    ]
        \addplot+[mark = none, red] table[
            col sep = semicolon
        ] {table.csv};
    \end{axis}

\end{tikzpicture}

\end{document}

Erwartete Ausgabe

Diese Ausgabe wurde durch einen kleinen "Hack" generiert. Um die richtige Achse zu haben, habe ich das Diagramm wie zuvor gezeichnet, aber die Farbe red!0so geändert, dass es transparent ist. Dann habe ich für jeden Tabelleneintrag die Zeilen mit dem \drawBefehl manuell gezeichnet . Es versteht sich von selbst, dass dies nicht optimal ist, aber zumindest die gewünschte Ausgabe veranschaulicht.

\documentclass{article}

\usepackage{pgfplots}
\pgfplotsset{compat = 1.17}
\usepackage{siunitx}

\begin{filecontents}{table.csv}
    57.7200;403.7083
    81.1200;359.9954
    83.7600;2673.1575
    84.4800;201.8542
    95.7600;359.9954
    104.6400;403.7083
    104.8800;2673.1575
    105.0000;5146.4829
    105.1200;11393.4863
    105.2400;5706.3101
    105.9600;201.8542
    106.9200;4277.3057
    107.2800;359.9954
    107.4000;682.9842
    107.8800;2673.1575
    108.0000;403.7083
    108.3600;2673.1575
    108.6000;201.8542
    109.2000;47.6190
    109.4400;3883.1460
    109.9200;4081.7891
    110.0400;1113.2275
\end{filecontents}


\begin{document}

\begin{tikzpicture}
    
    \begin{axis}[
        xlabel = {\textit{m/z}},
        ylabel = {Int. [\si{cps}]},
    ]
        \addplot+[mark = none, red!0] table[
            col sep = semicolon
        ] {table.csv};
        \draw[red] (57.7200,0) -- (57.7200,403.7083);
        \draw[red] (81.1200,0) -- (81.1200,359.9954);
        \draw[red] (83.7600,0) -- (83.7600,2673.1575);
        \draw[red] (84.4800,0) -- (84.4800,201.8542);
        \draw[red] (95.7600,0) -- (95.7600,359.9954);
        \draw[red] (104.6400,0) -- (104.6400,403.7083);
        \draw[red] (104.8800,0) -- (104.8800,2673.1575);
        \draw[red] (105.0000,0) -- (105.0000,5146.4829);
        \draw[red] (105.1200,0) -- (105.1200,11393.4863);
        \draw[red] (105.2400,0) -- (105.2400,5706.3101);
        \draw[red] (105.9600,0) -- (105.9600,201.8542);
        \draw[red] (106.9200,0) -- (106.9200,4277.3057);
        \draw[red] (107.2800,0) -- (107.2800,359.9954);
        \draw[red] (107.4000,0) -- (107.4000,682.9842);
        \draw[red] (107.8800,0) -- (107.8800,2673.1575);
        \draw[red] (108.0000,0) -- (108.0000,403.7083);
        \draw[red] (108.3600,0) -- (108.3600,2673.1575);
        \draw[red] (108.6000,0) -- (108.6000,201.8542);
        \draw[red] (109.2000,0) -- (109.2000,47.6190);
        \draw[red] (109.4400,0) -- (109.4400,3883.1460);
        \draw[red] (109.9200,0) -- (109.9200,4081.7891);
        \draw[red] (110.0400,0) -- (110.0400,1113.2275);
    \end{axis}

\end{tikzpicture}

\end{document}

Antworten

3 Noname Nov 01 2020 at 15:28

Ich denke du suchst ycomb.

\documentclass{article}

\usepackage{pgfplots}
\pgfplotsset{compat = 1.17}
\usepackage{siunitx}

\begin{filecontents}[overwrite]{table.csv}
    57.7200;403.7083
    81.1200;359.9954
    83.7600;2673.1575
    84.4800;201.8542
    95.7600;359.9954
    104.6400;403.7083
    104.8800;2673.1575
    105.0000;5146.4829
    105.1200;11393.4863
    105.2400;5706.3101
    105.9600;201.8542
    106.9200;4277.3057
    107.2800;359.9954
    107.4000;682.9842
    107.8800;2673.1575
    108.0000;403.7083
    108.3600;2673.1575
    108.6000;201.8542
    109.2000;47.6190
    109.4400;3883.1460
    109.9200;4081.7891
    110.0400;1113.2275
\end{filecontents}


\begin{document}

\begin{tikzpicture}
    
    \begin{axis}[
        xlabel = {\textit{m/z}},
        ylabel = {Int. [\si{cps}]},
    ]
        \addplot+[mark = none, red,ycomb] table[
            col sep = semicolon
        ] {table.csv};
    \end{axis}

\end{tikzpicture}

\end{document}

3 frougon Nov 01 2020 at 14:46

Wie in der anonymen Antwort gezeigt , ycombkann die Arbeit erledigen. Ein anderer Weg ist zu verwenden ybar. Dadurch wird jeder Datenpunkt als vertikaler Balken dargestellt (für horizontale Balken würden Sie verwenden xbar). Die Balkenbreite kann wie folgt angepasst werden bar width:

\begin{axis}[..., ybar, bar width=0.4pt]
    \addplot table[draw=none] {table.csv};
\end{axis}

Wie Sie selbst herausgefunden haben, draw=nonekönnen Sie die genau angegebene Breite für die Stangen ermitteln, andernfalls werden sie aufgrund der drawOperation etwas größer gezeichnet .

Vollständiges Beispiel:

\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.17}
\usepackage{siunitx}

\begin{filecontents}{table.csv}
    57.7200;403.7083
    81.1200;359.9954
    83.7600;2673.1575
    84.4800;201.8542
    95.7600;359.9954
    104.6400;403.7083
    104.8800;2673.1575
    105.0000;5146.4829
    105.1200;11393.4863
    105.2400;5706.3101
    105.9600;201.8542
    106.9200;4277.3057
    107.2800;359.9954
    107.4000;682.9842
    107.8800;2673.1575
    108.0000;403.7083
    108.3600;2673.1575
    108.6000;201.8542
    109.2000;47.6190
    109.4400;3883.1460
    109.9200;4081.7891
    110.0400;1113.2275
\end{filecontents}

\begin{document}

\begin{tikzpicture}
    \begin{axis}[
        xlabel = {\textit{m/z}},
        ylabel = {Int. [\si{cps}]},
        ybar, bar width = 0.4pt,
    ]
        \addplot+[draw=none, fill=red] table[col sep = semicolon] {table.csv};
    \end{axis}
\end{tikzpicture}

\end{document}

Wenn Sie möchten bar width, dass der Wert dem aktuellen PGF line widthin der entspricht tikzpicture, können Sie Folgendes verwenden bar width/.expanded = \the\pgflinewidth:

\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.17}
\usepackage{siunitx}

\begin{filecontents}{table.csv}
    57.7200;403.7083
    81.1200;359.9954
    83.7600;2673.1575
    84.4800;201.8542
    95.7600;359.9954
    104.6400;403.7083
    104.8800;2673.1575
    105.0000;5146.4829
    105.1200;11393.4863
    105.2400;5706.3101
    105.9600;201.8542
    106.9200;4277.3057
    107.2800;359.9954
    107.4000;682.9842
    107.8800;2673.1575
    108.0000;403.7083
    108.3600;2673.1575
    108.6000;201.8542
    109.2000;47.6190
    109.4400;3883.1460
    109.9200;4081.7891
    110.0400;1113.2275
\end{filecontents}

\begin{document}

\begin{tikzpicture}[line width=2pt]
    \begin{axis}[
        xlabel = {\textit{m/z}},
        ylabel = {Int. [\si{cps}]},
        ybar, bar width/.expanded = \the\pgflinewidth,
    ]
        \addplot+[draw=none, fill=red] table[col sep = semicolon] {table.csv};
    \end{axis}
\end{tikzpicture}

\end{document}