Pgfplots: Diskrete statt verbundene Werte
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
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}
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}