Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

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 {%
\csvreader[head to column names]{data.csv}{}{(\a,\b) }
};
\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 ?

share|improve this question
    
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

2 Answers 2

up vote 14 down vote accepted

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}
share|improve this answer
1  
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
2  
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}
    \csvreader[ head to column names,%
                late after head=\xdef\aold{\a}\xdef\bold{\b},%
                after line=\xdef\aold{\a}\xdef\bold{\b}]%
                {data.csv}{}{%
    \draw (\aold, \bold) -- (\a,\b) node {$\times$};
    }
\end{tikzpicture}
\end{document}

I get the output below. Now I can get back to work and print a whole bunch of data in my report ;-) I love it !

Plot of CSV data using <code>tikz</code> and <code>csvsimple</code>

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.