# Drawing different tikz shapes parameterized by data from a file

I have a file with three columns of data, x, y, r.

# x y r
1 1 0.1
2 2 0.5
3 3 1.2


and so on. I'd like to loop over the rows, and draw a circle at x,y with radius r for each row.

I first thought I'd use pgfplots with customized marks, but I couldn't figure out how to pass the radius parameter into the pgfplot mark handler. Then I thought I'd use tikz and pgf directly, but I couldn't figure out how to reference the values for r inside a draw command sequence.

Any thoughts ? I'd be very grateful for some help.

Another option is to use the datatool package.

\documentclass[a4paper]{scrartcl}
\usepackage{datatool,tikz}

\begin{document}
\begin{tikzpicture}
\DTLforeach*{coordinates}{\x=x, \y=y, \r=r}{\draw (\x,\y) circle (\r);}
\end{tikzpicture}
\end{document}


where coord.dat is a comma separated file with header row, e.g.

x,y,r
2,1,0.1
3,2,0.5
1,3,1.2


I suggest this solution

\documentclass{standalone}

\usepackage{tikz}

\usepackage{pgfplotstable}

\begin{document}
\centering
\begin{tikzpicture}
\pgfplotstablegetrowsof{\table}
\pgfmathsetmacro{\M}{\pgfplotsretval-1}
\pgfplotstablegetcolsof{\table}
\pgfmathsetmacro{\N}{\pgfplotsretval-1}

\foreach \row in {0,...,\M}{
\foreach \col in {0,...,\N}{
\pgfplotstablegetelem{\row}{[index]\col}\of\table
\ifnum\col=0
\xdef\x{\pgfplotsretval}
\fi
\ifnum\col=1
\xdef\y{\pgfplotsretval}
\fi
\ifnum\col=2
\fi
}
\definecolor{mycolor}{RGB}{\pdfuniformdeviate 256,%
\pdfuniformdeviate 256,%
\pdfuniformdeviate 256}
}
\end{tikzpicture}
\end{document}


where circles.dat is a file like this

0.75465 2.31086 0.54389
1.43749 1.05065 0.72105
0.18223 1.98603 0.52250
2.30484 1.66463 0.99370
1.36673 1.68386 0.21868
2.18637 3.33167 0.10580
1.70292 0.76932 0.10970
0.64444 0.61346 0.06359
1.29524 0.58225 0.40458
1.35803 2.16296 0.44837
2.54315 2.60982 0.36582
4.72587 0.26478 0.76350
0.41787 0.63615 0.62790
2.83713 0.47686 0.77198
0.94492 0.93983 0.93285
0.11940 2.58221 0.97274
2.42922 0.95893 0.19203
0.90028 3.19658 0.13887
2.29363 1.08943 0.69627
0.66194 2.58925 0.09382


where the first column is x, the second y and the third is the radius.

The result is the following

I hope it helped!

• @Azoun wow, NICE solution! – cmo Feb 25 '14 at 17:17

Just for completeness, here's a way to control the radius of the plot marks in PGFplots. In general, scatter allows control over the individual plot marks, and scatter src is used to determine where the data for parametrising the marks comes from. scatter src=explicit means that the data is provided in an additional column.

The @pre marker code is code that is executed just before each marker, and can be used to set the radius of the markers. In order to specify the radius in the same units as the rest of the plot, you have to convert "meta data" to scaled axis units using \pgfplotstransformcoordinatex and multiply the result by the length of the unit vector, \pgfplotsunitxlength.

\documentclass{article}

\usepackage{pgfplots, filecontents}

\begin{filecontents}{data.dat}
# x y r
1 1 1
3 2 0.5
6 3 2
\end{filecontents}
\makeatletter
\begin{document}
\begin{tikzpicture}
\begin{axis}[scatter,
scatter src=explicit,
axis equal,
only marks,
grid=both,
width=10cm,
xmin=0, xmax=8,
scatter/@pre marker code/.code={%
\pgfplotstransformcoordinatex{\pgfplotspointmeta}%
\scope[mark size=\pgfplotsunitxlength*\pgfmathresult]
}
]