5

I've already produced the following picture by means of TikZ. enter image description here To do it, I modified the Sudoku example found here as follows:

\documentclass{standalone}

\usepackage{xcolor}
\usepackage{tikz}
\usetikzlibrary{positioning,arrows}

\begin{document}

\fontsize{5}{6}

\begin{tikzpicture}[>=stealth,every node/.style={minimum size=1cm},on grid]

\begin{scope}[every node/.append style={yslant=-0.5},yslant=-0.5]
  \shade[right color=gray!10, left color=black!50] (0,0) rectangle +(3,3);
\end{scope}

\begin{scope}[every node/.append style={yslant=0.5},yslant=0.5]
  \shade[right color=gray!70,left color=gray!10] (3,-3) rectangle +(3,3);
\end{scope}

\begin{scope}[every node/.append style={yslant=0.5,xslant=-1},yslant=0.5,xslant=-1]
  \shade[bottom color=gray!10, top color=black!50] (6,3) rectangle +(-3,-3);
\end{scope}

\begin{scope}[every node/.append style={yslant=-0.5},yslant=-0.5]
  \foreach \i in {.5,1.5,...,2.5}
  \foreach \j in {.5,1.5,...,2.5}
  {
  \node at (\i,\j) {$+$};
  }

  \foreach \i in {0,3}
  \foreach \j in {.5,1.5,...,2.5}
  {
  \node at (\i,\j) {$+$};
  }

  \foreach \i in {.5,1.5,...,2.5}
  \foreach \j in {0,3}
  {
  \node at (\i,\j) {$+$};
  }

  \foreach \i in {0,1,...,3}
  \foreach \j in {.5,1.5,...,2.5}
  {
  \node at (\i,\j) {$+$};
  }

  \draw (0,0) grid (3,3);
\end{scope}

\begin{scope}[every node/.append style={yslant=0.5},yslant=0.5]  
  \foreach \i in {3.5,4.5,...,5.5}
  \foreach \j in {-2.5,-1.5,...,-.5}
  {
  \node at (\i,\j) {$+$};
  }

  \foreach \i in {3,6}
  \foreach \j in {-2.5,-1.5,...,-.5}
  {
  \node at (\i,\j) {$+$};
  }

  \foreach \i in {3.5,4.5,...,5.5}
  \foreach \j in {-3,0}
  {
  \node at (\i,\j) {$+$};
  }

  \draw (3,-3) grid (6,0);
\end{scope}

\begin{scope}[every node/.append style={yslant=0.5,xslant=-1},yslant=0.5,xslant=-1]  
  \foreach \i in {3.5,4.5,...,5.5}
  \foreach \j in {0.5,1.5,...,2.5}
  {
  \node at (\i,\j) {$+$};
  }

  \foreach \i in {3,6}
  \foreach \j in {0.5,1.5,...,2.5}
  {
  \node at (\i,\j) {$+$};
  }

  \foreach \i in {3.5,4.5,...,5.5}
  \foreach \j in {0,3}
  {
  \node at (\i,\j) {$+$};
  }

  \draw (3,0) grid (6,3);
\end{scope}

\begin{scope}[every node/.append style={yslant=-0.5},yslant=-0.5]
  \foreach \i in {.5,1.5,...,2.5}
  \foreach \j in {.5,1.5,...,2.5}
  {
  \draw[<-] (\i,\j) -- +(-.2,-.2);
  }

  \foreach \i in {0,3}
  \foreach \j in {.5,1.5,...,2.5}
  {
  \draw[red,<-] (\i,\j) -- +(-.2,-.2);
  }

  \foreach \i in {.5,1.5,...,2.5}
  \foreach \j in {0,3}
  {
  \draw[red,<-] (\i,\j) -- +(-.2,-.2);
  }

  \foreach \i in {0,1,...,3}
  \foreach \j in {.5,1.5,...,2.5}
  {
  \draw[red,->] (\i,\j) -- +(.2,0);
  }

  \foreach \i in {.5,1.5,...,2.5}
  \foreach \j in {0,1,...,3}
  {
  \draw[red,->] (\i,\j) -- +(0,.2);
  }  
\end{scope}

\begin{scope}[every node/.append style={yslant=0.5},yslant=0.5]  
  \foreach \i in {3.5,4.5,...,5.5}
  \foreach \j in {-2.5,-1.5,...,-.5}
  {
  \draw[->] (\i,\j) -- +(.2,-.2);
  }

  \foreach \i in {3,6}
  \foreach \j in {-2.5,-1.5,...,-.5}
  {
  \draw[red,->] (\i,\j) -- +(.2,-.2);
  }

  \foreach \i in {3.5,4.5,...,5.5}
  \foreach \j in {-3,0}
  {
  \draw[red,->] (\i,\j) -- +(.2,-.2);
  }

  \foreach \i in {3,4,...,6}
  \foreach \j in {-2.5,-1.5,...,-.5}
  {
  \draw[red,->] (\i,\j) -- +(.2,0);
  }

  \foreach \i in {3.5,4.5,...,5.5}
  \foreach \j in {-3,-2,...,0}
  {
  \draw[red,->] (\i,\j) -- +(0,.2);
  }  
\end{scope}

\begin{scope}[every node/.append style={yslant=0.5,xslant=-1},yslant=0.5,xslant=-1]  
  \foreach \i in {3.5,4.5,...,5.5}
  \foreach \j in {0.5,1.5,...,2.5}
  {
  \draw[->] (\i,\j) -- +(.2,.2);
  }

  \foreach \i in {3,6}
  \foreach \j in {0.5,1.5,...,2.5}
  {
  \draw[red,->] (\i,\j) -- +(.2,.2);
  }

  \foreach \i in {3.5,4.5,...,5.5}
  \foreach \j in {0,3}
  {
  \draw[red,->] (\i,\j) -- +(.2,.2);
  }

  \foreach \i in {3,4,...,6}
  \foreach \j in {0.5,1.5,...,2.5}
  {
  \draw[red,->] (\i,\j) -- +(.2,0);
  }

  \foreach \i in {3.5,4.5,...,5.5}
  \foreach \j in {0,1,...,3}
  {
  \draw[red,->] (\i,\j) -- +(0,-.2);
  }
\end{scope}
\end{tikzpicture}

\end{document}

I had to use multiple scope environments with the same yslant and slant in order to obtain the layers to correctly overlay each other.

Nevertheless I'm not so happy with the picture, since I could not easily change the view. Is there a more effective way to draw such a picture in TikZ (or, more generally, in LaTeX)? I would like to use TikZ (and not to produce the picture with external programs, e.g. MATLAB), since I should insert legend, labels, a other text stuff in such a picture. Furthermore, I suspect pgfplots is the answer, but I'm not sure.

EDIT: I think a complete answer can come from those who fully understand this answer by @Tom Bombadil.

  • "...since I could not easily change the view" What do you mean? If you want to "rotate" it... :P – Alenanno Feb 10 '16 at 11:26
  • Oh, yes, I used the word "view" to make you think to view={⟨h⟩}{⟨v⟩} option of pgfplots' axis environment. – Enrico Maria De Angelis Feb 10 '16 at 11:29
  • 1
    Take a look at this tex.stackexchange.com/questions/262290/… – CroCo Feb 12 '16 at 2:13
3

So far I've been able to draw such a thing using pgfplots:

\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.12}
\begin{document}
\begin{tikzpicture}
   \begin{axis}[
       xmin=0,
       xmax=1,
       ymin=0,
       ymax=1,
       zmin=0,
       zmax=1,
       axis equal,
       ticks=none,
       hide axis,
     ]
%lower face, drawn first as it will be hidden
     \addplot3[black,/pgfplots/quiver,
       quiver/u=0,
       quiver/v=0,
       quiver/w=0.1,
       -{stealth[]},
       samples=3,
       domain=0.16666:0.8333,
     ]{0};
     \addplot3[red,/pgfplots/quiver,
       quiver/u=0.1,
       quiver/v=0,
       quiver/w=0,
       -stealth,
       samples=4,
       domain y=0.16666:0.8333,
       samples y=3,
       domain=0:1,
     ]{0};
     \addplot3[red,/pgfplots/quiver,
       quiver/u=0,
       quiver/v=-0.1,
       quiver/w=0,
       stealth-,
       samples=3,
       domain=0.16666:0.8333,
       samples y=4,
       domain y=0:1,
     ]{0};
%hidden right face, drawn first as it will be hidden
     \addplot3[black,/pgfplots/quiver,
       quiver/u=0,
       quiver/v=0,
       quiver/w=0.1,
       -{stealth[]},
       samples=3,
       domain=0.16666:0.8333,
     ](x,1,y);
     \addplot3[red,/pgfplots/quiver,
       quiver/u=0.1,
       quiver/v=0,
       quiver/w=0,
       -stealth,
       samples=4,
       domain y=0.16666:0.8333,
       samples y=3,
       domain=0:1,
     ](x,1,y);
     \addplot3[red,/pgfplots/quiver,
       quiver/u=0,
       quiver/v=0,
       quiver/w=0.1,
       -stealth,
       samples=3,
       domain=0.16666:0.8333,
       samples y=4,
       domain y=0:1,
     ](x,1,y);
%hidden left face, drawn first as it will be hidden
     \addplot3[black,/pgfplots/quiver,
       quiver/u=0,
       quiver/v=0,
       quiver/w=0.1,
       -{stealth[]},
       samples=3,
       domain=0.16666:0.8333,
     ](0,x,y);
     \addplot3[red,/pgfplots/quiver,
       quiver/u=0,
       quiver/v=-0.1,
       quiver/w=0,
       stealth-,
       samples=4,
       domain y=0.16666:0.8333,
       samples y=3,
       domain=0:1,
     ](0,x,y);
     \addplot3[red,/pgfplots/quiver,
       quiver/u=0,
       quiver/v=0,
       quiver/w=0.1,
       -stealth,
       samples=3,
       domain=0.16666:0.8333,
       samples y=4,
       domain y=0:1,
     ](0,x,y);
      % faces
     \addplot3[surf,
       color=black!40,
       faceted color=black!80,
     domain=0:1,
   domain y=0:1,
   samples=4,
   samples y=4,
 ]
     (x,0,y);
     \addplot3[surf,
       color=black!40,
       faceted color=black!80,
     domain=0:1,
   domain y=0:1,
   samples=4,
   samples y=4,
 ]
     {1};
     \addplot3[surf,
       color=black!40,
       faceted color=black!80,
     domain=0:1,
   domain y=0:1,
   samples=4,
   samples y=4,
 ]
     (1,x,y);
     %upper face
     \addplot3[black,/pgfplots/quiver,
       quiver/u=0,
       quiver/v=0,
       quiver/w=0.1,
       -{stealth[]},
       samples=3,
       domain=0.16666:0.8333,
     ]{1};
    \addplot3[mark=x,
      only marks,
       samples=3,
       domain=0.16666:0.8333,
     ]{1};
     \addplot3[red,/pgfplots/quiver,
       quiver/u=0.1,
       quiver/v=0,
       quiver/w=0,
       -stealth,
       samples=4,
       domain y=0.16666:0.8333,
       samples y=3,
       domain=0:1,
     ]{1};
     \addplot3[red,/pgfplots/quiver,
       quiver/u=0,
       quiver/v=0.1,
       quiver/w=0,
       -stealth,
       samples=3,
       domain=0.16666:0.8333,
       samples y=4,
       domain y=0:1,
     ]{1};
     %left face
    \addplot3[black,/pgfplots/quiver,
       quiver/u=0,
       quiver/v=-0.1,
       quiver/w=0,
       {stealth[]}-,
       samples=3,
       domain=0.16666:0.8333,
     ](x,0,y);
    \addplot3[mark=x,
      only marks,
       samples=3,
       domain=0.16666:0.8333,
     ](x,0,y);
     \addplot3[red,/pgfplots/quiver,
       quiver/u=0.1,
       quiver/v=0,
       quiver/w=0,
       -stealth,
       samples=4,
       domain y=0.16666:0.8333,
       samples y=3,
       domain=0:1,
     ](x,0,y); 
     \addplot3[red,/pgfplots/quiver,
       quiver/u=0,
       quiver/v=0,
       quiver/w=0.1,
       -stealth,
       samples=3,
       domain=0.16666:0.8333,
       samples y=4,
       domain y=0:1,
     ](x,0,y);
   %right face
    \addplot3[black,/pgfplots/quiver,
       quiver/u=0.1,
       quiver/v=0,
       quiver/w=0,
       -{stealth[]},
       samples=3,
       domain=0.16666:0.8333,
     ](1,x,y);
    \addplot3[mark=x,
      only marks,
       samples=3,
       domain=0.16666:0.8333,
     ](1,x,y);
     \addplot3[red,/pgfplots/quiver,
       quiver/u=0,
       quiver/v=0.1,
       quiver/w=0,
       -stealth,
       samples=4,
       domain y=0.16666:0.8333,
       samples y=3,
       domain=0:1,
     ](1,x,y); 
     \addplot3[red,/pgfplots/quiver,
       quiver/u=0,
       quiver/v=0,
       quiver/w=0.1,
       -stealth,
       samples=3,
       domain=0.16666:0.8333,
       samples y=4,
       domain y=0:1,
     ](1,x,y);
 \end{axis}
\end{tikzpicture}
\end{document}

Which leads to the following fig:

enter image description here

There are still a few differences (markers are not aligned, no shadings) but it's manageable. The more complicated thing is to optimize the code which is a mess^^

And I don't know how to manage the order of the faces so that they hide in the good order.

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.