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.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

While I am gradually becoming more proficient at TeX, I am still very new to TikZ. I am typesetting some notes for Analysis, and would like to be able to produce a map which shows 2 sets (X and Y) and a function (f: X \to Y) which also indicates a few points in the domain and shows where they land; in the codomain and also diagrams the range of the function f. I am not quite sure even how to start. Any help will be appreciated.

share|improve this question
It would be helpful to show an image of what you are looking for. And, even if you are new, you should at least be able to make a start at it. For instance, can you show a small filled circle to represent the points in the domain? – Peter Grill May 16 '12 at 21:57
up vote 9 down vote accepted

Here is a starter for you to speed up the learning curve.

%put some nodes on the left
\foreach \x in {1,2,3}{
\node[fill,circle,inner sep=2pt] (d\x) at (0,\x) {};
\node[fit=(d1) (d2) (d3),ellipse,draw,minimum width=1cm] {}; 
%put some nodes on the center
\foreach \x[count=\xi] in {0.5,1.5,...,4}{
\node[fill,circle,inner sep=2pt] (r\xi) at (2,\x) {};
\node[fit=(r1) (r2) (r3) (r4),ellipse,draw,minimum width=1.5cm] {}; 
%put some nodes on the right
\foreach \x[count=\xi] in {0.75,1.5,...,3}{
\node[fill,circle,inner sep=2pt] (c\xi) at (4,\x) {};
\node[fit=(c1) (c2) (c3) (c4) ,ellipse,draw,minimum width=1.5cm] {};
\draw[-latex] (d1) -- (r2);
\draw[-latex] (d2) -- (r2);
\draw[-latex] (d3) -- (r4);
\draw[-latex] (r1) -- (c2);
\draw[-latex] (r2) -- (c3);
\draw[-latex] (d3) -- (r4);

enter image description here

share|improve this answer
Thank you very much. Later this evening, I shall try and make a few minor modifications to what you have here to suit what I would like to end up with. Thanks again. – Michael Dykes May 16 '12 at 22:39
@MichaelDykes Thank you! But please next time include a minimal code so that we can also play around with it. As it is, it's rather a draw-it-for-me question. – percusse May 16 '12 at 23:40
I am looking for a way to draw function diagrams exactly like this one, with domain and co-domain (range) correspondences, but I get 101 errors when compiling the code above... Message of first error is: "Use of \x doesn't match its definition. \tikz@scan@no@calculator ... \edef \tikz@temp { (#2) }\expandafter \tikz@@scan@... 1.401} Am I doing something wrong? I just took everything between \begin{tikzpicture} and \end{tikzpicture} including, inserted it in file that already compiles and run it -- to no avail. Please help... Thanks, Colin. – Diegis Sep 16 '12 at 3:29
@Diegis It compiles fine for me. Maybe there is an update needed or you missed the necessary TikZ libraries such that some commands are not recognized? – percusse Sep 16 '12 at 7:33

Took me a while to try the stuff out, I'm also pretty new to TikZ. There might be much nicer solutions that don't use absolute coordinates though.


    % draw the sets
    \filldraw[fill=blue!20, draw=blue!60] (-1.5,0) circle (1cm);
    \filldraw[fill=red!20, draw=red!60] (1.5,0) circle (1cm);
    \filldraw[fill=green!20, draw=green!60] (1,0) circle (0.5cm);

    % the texts
    \node at (1,0) {\tiny$f(x)$};
    \node at (0,-2) {$f: X \to Y$};

    % the points in the sets (here I just create nodes to use them later on to position
    % the circles and the arrows
    \node (x1) at (-1,0.7) {};
    \node (x2) at (-1.3,-0.7) {};
    \node (y1) at (1.5,0.5) {};
    \node (y2) at (1.8,-0.5) {};

    % position the elements in the sets (at the nodes we just created)
    \fill[blue] (x1) circle (1pt);
    \fill[blue] (x2) circle (1pt);
    \fill[red] (y1) circle (1pt);
    \fill[red] (y2) circle (1pt);

    % draw the arrows
    \draw[->] (x1) -- (y1);
    \draw[->] (x2) -- (y2);

result of above code

If you are unsure where to start, the manual is a good place. Most of the stuff I wrote is from the tutorials.

If you are just getting started QTikz is a really nice tool, the editor has a panel that is refreshed every few seconds, makes trial/error much easier than having to compile/switch program all the time.

share|improve this answer

Your Answer


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.