# Tikz grid does not use tikzpicture unit lengths

Grid separation is controlled by xstep and ystep which store the value in \[email protected]@x and \[email protected]@y respectively. Their initial value are defined in tikz.code.tex

\def\[email protected]@x{1cm}%
\def\[email protected]@y{1cm}%


In your second example, you set x=0.5cm, y=0.5cm, which means (-2, -2) is parsed as (-1cm, -1cm) and (2, 2) is parsed as (1cm, 1cm). This is because when coordinates is passed to parse, they are first checked if the x and y coordinate is with unit by \[email protected]. Then tikz can judge if it is with a unit by \[email protected], if not the coordinate is set by \pgfpointxy, otherwise the coordinate is set by \pgfpoint. Actually there are four cases to handle, related code is

\def\[email protected]@@[email protected]#1#2#3){%
\[email protected]@,{#3}%
\[email protected]@%
\[email protected]@splitxyz{#1}{#2}#3,%
\else%
\[email protected]{#2}%
\[email protected]%
\[email protected]{#3}%
\[email protected]%
\def\[email protected]{#1{\pgfpoint{#2}{#3}}}%
\else%
\fi%
\else%
\[email protected]{#3}%
\[email protected]%
\else%
\def\[email protected]{#1{\pgfpointxy{#2}{#3}}}%
\fi%
\fi%
\fi%
\[email protected]%
}%


Similar parse mechanism is also applied to xstep and ystep

    \[email protected]{\[email protected]@x}%
\[email protected]%
\[email protected]{\pgfpoint{\[email protected]@x}{0pt}}%
\else%
\[email protected]{\pgfpointxy{\[email protected]@x}{0}}%
\fi%
\[email protected]=\[email protected]%
\[email protected]=\[email protected]%
\[email protected]{\[email protected]@y}%
\[email protected]%
\[email protected]{\pgfpoint{0pt}{\[email protected]@y}}%
\else%
\[email protected]{\pgfpointxy{0}{\[email protected]@y}}%
\fi%
\pgfpathgrid[stepx=\[email protected],stepy=\[email protected]]%
{\pgfqpoint{\[email protected]}{\[email protected]}}{\pgfqpoint{\[email protected]}{\[email protected]}}%


In your example they are just 1cm, so the same fig can be draw by

\draw (-1cm, -1cm) grid (1cm, 1cm);


and \fill (1, 1) circle [radius=3pt]; is equal to \fill (0.5cm, 0.5cm) circle (3pt); which is not on any grid point.

According to the pgfmanual, the grid is drawn with steps as configured through /tikz/step=h which as far as the manual says is a number or dimension or coordinate and has (no default, initially 1cm).

So if you want the grid to be not drawn with 1cm, you have to change the step, as in (or locally, just for the grid drawing command):

\documentclass{article}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}
\draw[very thick] (-2,-2) rectangle (2,2);
\draw (-2,-2) grid (2,2);
\end{tikzpicture}

\begin{tikzpicture}[x=0.5cm,y=0.5cm,step=0.5cm]
\draw[very thick] (-2,-2) rectangle (2,2);
\draw (-2,-2) grid (2,2);