6

This question is related to Strange behavior in TikZ \draw command but is not the same.

While working with coordinates and nodes in TikZ, I was expecting that:

  \coordinate (x) at (4,0) node[right] {$x$};
  \coordinate (y) at (0,3) node[above] {$y$}; 

and

  \node[right] at (x) {$x$};
  \node[above] at (y) {$y$};

would yield the same result. But they don't. I get the following output:

enter image description here

With \coordinate (x) at (4,0) node[right] {$x$};, I meant, the system will create a node at (4,0) and will place the text $x$ to its right.

Based on the output, I see the text $x$ is placed at (0,0), with the above command.

Why does this happen.

MWE:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}
  \coordinate (x) at (4,0) node[right] {$x$};
  \coordinate (y) at (0,3) node[above] {$y$};

  \node[right] at (x) {$x$};
  \node[above] at (y) {$y$};

  \draw[<->,thick] (0,3) |- (4,0);
\end{tikzpicture}
\end{document} 
  • 1
    Why would they? Try \path (x) node[right] {$x$};\path (y) node[above] {$y$};. If you give TikZ contradicting instructions, or place the instructions in the wrong order, you will get an unexpected result. BTW, you expect answerers to provide you with a full MWE, i.e. a document that starts with \documentclass etc. Could you please consider also using such an MWE in your question? – marmot Mar 25 at 16:53
  • @marmot - I have added the MWE. – subham soni Mar 25 at 16:59
  • A trick to solve all these mysteries: just add draw option to the nodes, and you will probably see the difference. – JouleV Mar 25 at 17:02
  • @JouleV - That would still not explain why it happens. I am more interested in the why part. – subham soni Mar 25 at 17:07
  • 1
    The "why part" is simply that in \coordinate (x) at (4,0) node[right] {$x$}; the at (4,0) gets eaten up by \coordinate (x) at and then TikZ "sees" node[right] {$x$} and inserts the default coordinate (0,0) to parse it. – marmot Mar 25 at 18:51
5

It doesn't give you the expected result because the syntax is not appropriate. (At which level do you expect an explanation? Does it help that in \coordinate (x) at (4,0) node[right] {$x$}; at (4,0) got "absorbed" by coordinate (x) so that TikZ adds the default coordinate (0,0) to interpret node[right] {$x$}?) You can condense all statements to one line.

\documentclass[tikz,border=3.14mm]{standalone}
\begin{document}
\begin{tikzpicture}
  \draw[<->,thick] (0,3) coordinate (y) node[above] {$y$} |- (4,0) coordinate (x)  node[right] {$x$};
\end{tikzpicture}
\end{document} 

enter image description here

  • Nice explanation. I want to notice that your "one line" can further be simplified to \draw[<->,thick] (0,3) |- (4,0) node[right] {$x$} node[at start,above] {$y$}; since the coordinates (x) and (y) seems to be redundant for further purposes (IMHO). But I know you know that fact (you know everything about TikZ). – Marian G. Mar 27 at 19:10
  • @MarianG. Thanks, I fully agree with that. I was not sure if the OP wants to do something with the coordinates later on, at least their names suggest something like \begin{scope}[x={(x)},y={(y)}], so I kept them. – marmot Mar 27 at 20:06
5

In section 17.2.1 of the TikZ manual, the commands for such works are shown:

  • \path ... node ... (1.1)
    or \node ... (1.2)

  • \path ... coordinate ... (2.1)
    or \coordinate ... (2.2)

\coordinate ... node ... are not present for the same job! In fact, since \coordinate is the same as \path coordinate so \coordinate (x) at (4,0) node[right] {$x$}; is understood as

\path coordinate (x) at (4,0);  % or `\coordinate (x) at (4,0);
\path node[right] {$x$}; % (0,0) in case no coordinates are specified

This makes the outputs of \coordinate (x) at (4,0) node[right] {$x$}; and \node[right] at (x) {$x$}; not the same at all.

That is why we get

enter image description here

with this code

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\coordinate (x) at (2,0) node[draw,right] {world};
\fill (x) circle (1pt)
    (0,0) circle (1pt);
\end{tikzpicture}
\end{document}

and we get

enter image description here

with this code

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\node[draw] (x) at (2,0) {Hello} node[draw,right] {world};
\fill (0,0) circle (1pt);
\end{tikzpicture}
\end{document}

So how to solve it? We can't combine (2.2) or (1.2) with ... node ..., but we can do it with (1.1) or (2.1):

\path (4,0) coordinate (x) node[right] {$x$};

Remember that \draw, \fill, \filldraw... are all daughters of \path, so they are all valid. But \node and \coordinate are not – they are less general versions of \path..


I found this using the draw powerful trick :)

  • @Kpym Thanks! Edited. – JouleV Mar 26 at 11:54
3

try the following:

\documentclass{article}
\usepackage{tikz}
%\usetikzlibrary{intersections} not used in this mwe

\begin{document}
\begin{tikzpicture}
  \coordinate[label=right:$x$] (x) at (4,0);
  \coordinate[label=above:$y$] (y) at (0,3);

  \draw[<->,thick] (y) |- (x);
\end{tikzpicture}
\end{document}

enter image description here

addendum: as response to Martin Argerami coments below my answer, who is convinced that my answer not address op problem (and consequently he apparently down vote it, for what i'm very grateful. his message is very clear: don't show people some possible solution for which they not explicit ask). however let me note some my view on the problem:

  • in answer i only suggest to see if my suggestion can help to op
  • it solve the problem of placement of coordinate labels (in this is all about it, isn't it?)
  • if the answer is not helpful, op can select one from other two answers as the best one and accept it.
  • to be strict to Martins' consideration, that he should down vote many other answers, which try show another possibility to achieve op goal (nice picture, table, etc) or is written as exercise (personal or for op) ...
  • on the end, i'm still convinced, that my answer not harm anyone, it only show another way how to draw coordinates shown in op mwe. is this worth for down voting it?
  • 1
    I don't see how this answers the question. – Martin Argerami Mar 27 at 15:15
  • is image not enough illustrative? the problem in question is avoided with use of \coordinate instead of nodes which also make code shorter. – Zarko Mar 27 at 15:25
  • The OP knows how to draw the image. The question was why his second set of commands didn't put the x and y where he expected them. That's an issue with tikz syntax, and it is addressed by the other answers. – Martin Argerami Mar 27 at 16:49
  • well, why than complain on my answer? if op doesn't like mine solution, (in which i show an alternative, to my opinion better solution for his/her problem) (s)he can accept one of other two answers. – Zarko Mar 27 at 17:26
  • I didn't complain; I stated that it doesn't address OP's question. If OP doesn't like your solution he can choose another answer. If I don't like you solution, I can downvote it. And I can certainly comment that your answer doesn't address OP's question. – Martin Argerami Mar 27 at 17:57

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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