Tell me more ×
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.

I'm using pgfplots extensively and I'd like to avoid having to write legends every time, since all the text files I want to plot have explicit headers.

As a comparison, \pgfplotstabletypeset makes a nice table instantly with my data, and I'm looking for a similar way to get graphs in an easier way than having to specify each column, legend, etc....

share|improve this question

1 Answer

up vote 15 down vote accepted

You can access the column names of a PGFplots table through the macro \pgfplotstablegetcolumnnamebyindex{<index>}\of{<table macro>}\to{<macro>}. You can use this while looping through the columns of a table using \pgfplotsinvokeforeach{<list>}{<commands>} to add the column names as legend entries.

I've written a \plotfile macro that takes a filename as argument and then plots all columns starting from the second column against the first column:

\documentclass{article}
\usepackage{pgfplots}
\usepackage{filecontents}

\begin{filecontents}{testdata.dat}
Time Distance Velocity Something
0 0 1 0.2
1 1 1 0.3
1.999 1.999 1 0.4
2 2 0 0.4
3 2 0 0.5
\end{filecontents}


\newcommand{\plotfile}[1]{
    \pgfplotstableread{testdata.dat}{\table}
    \pgfplotstablegetcolsof{testdata.dat}
    \pgfmathtruncatemacro\numberofcols{\pgfplotsretval-1}
    \pgfplotsinvokeforeach{1,...,\numberofcols}{
        \pgfplotstablegetcolumnnamebyindex{##1}\of{\table}\to{\colname}
        \addplot table [y index=##1] {testdata.dat}; 
        \addlegendentryexpanded{\colname}
    }
}

\begin{document}
\begin{tikzpicture}
\begin{axis}[legend pos=north west]
\plotfile{testdata.dat}
\end{axis}
\end{tikzpicture}
\end{document}

plotting columns from a table

share|improve this answer
awesome thanks a lot. – ben paillard Jul 27 '11 at 22:25
@Jake, i tried this solution where instead of defining \newcommand{\plotfile}[1], i simply apply it below \begin{axis} and it didn't work. I am interesting to know why... What is the reason? – Eagle Feb 16 '12 at 9:55

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.