# How to plot data from a CSV file using tikz and csvsimple?

Here is a minimal example :

\begin{filecontents*}{data.csv}
a,b,c,d
1,4,5,1
2,3,1,5
3,5,6,1
4,1,4,9
5,3,4,7
\end{filecontents*}

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{csvsimple}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
\draw plot coordinates {%
};
\end{tikzpicture}
\end{document}


The command \csvreader[head to column names]{data.csv}{}{(\a,\b) } extracts coordinates (columns a and c) from the CSV file data.csv :

(1,4) (2,3) (3,5) (4,1) (5,3)


And yet, it seems that I can't plot the points above using tikz :

Package tikz Error: Cannot parse this coordinate


Any idea ?

-
Why simple way when there is complex methods? May be this answer -- tex.stackexchange.com/a/83740/11232 is useful (that uses pgfplotstable) –  Harish Kumar Nov 23 '12 at 2:17
I don't see any data printed with csvsimple package. Can you make it work if you use it outside the TikZ picture? –  percusse Nov 23 '12 at 3:16
\begin{tikzpicture} \csvreader[head to column names]{data.csv}{}{% \draw (\a,\b) node {$\times$}; } \end{tikzpicture} will work but I need to draw segments, not points. So I need a way to remember the previous point like in the csvsimple examples (not hard, but I don't know LaTeX that well). –  remjg Nov 23 '12 at 11:11
@HarishKumar I had a look at it, but I had so much trouble getting use to csvsimple... So I don't want to use an other package now ;-) –  remjg Nov 23 '12 at 11:32

If you need to plot data from files, I think you'll be much happier if you use PGFPlots instead of the native plot functionality of TikZ. Here's a very simple example of plotting your example data to get you started.

PGFPlots is very customizable, you can tweak virtually every aspect of your plots, and it's much more user-friendly than if you tried to knit everything yourself.

\documentclass{article}
\usepackage{pgfplots}
\usepackage{filecontents}
\begin{filecontents*}{data.csv}
a,b,c,d
1,4,5,1
2,3,1,5
3,5,6,1
4,1,4,9
5,3,4,7
\end{filecontents*}

\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot table [x=a, y=c, col sep=comma] {data.csv};
\end{axis}
\end{tikzpicture}
\end{document}

-
Indeed, it's pretty straightforward. I'll try today ! –  remjg Nov 23 '12 at 12:16
@RémiG.: Good decision =). If you have questions, don't hesitate to post them on the site, there are plenty of people with lots of PGFPlots expertise around here. –  Jake Nov 23 '12 at 12:19
I still face an issue. The same potion of code doesn't work inside a macro : File ended while scanning use of \pgfplots@addplotimpl@table@fromfile. Maybe I should ask another question... –  remjg Nov 23 '12 at 12:39
@RémiG.: If I wrap everything between \begin{tikzpicture} and \end{tikzpicture} in a \newcommand, it works fine. Maybe posting a new question is indeed a good idea. –  Jake Nov 23 '12 at 13:01
So I needed to add \shorthandoff{;} inside the tikzpicture environment to avoid problem with [frenchb]babel. The solution is explained here : tex.stackexchange.com/questions/74860/…. I'm all good now, thank you for your help ! –  remjg Nov 23 '12 at 14:20

It seems that it's impossible to call csvreader inside \draw plot coordinates { }. To avoid the plot command and still being able to plot lines between points, I need to use xdef to remember the previous point.

\begin{filecontents*}{data.csv}
a,b,c,d
1,4,5,1
2,3,1,5
3,5,6,1
4,1,4,9
5,3,4,7
\end{filecontents*}

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{csvsimple}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
\draw (\aold, \bold) -- (\a,\b) node {$\times$};