Como anotar matriz aleatória no TikZ

Aug 18 2020

Eu tenho o seguinte que gera uma imagem de matriz aleatória (primeiro exemplo). Mas não consigo descobrir como:

  1. corrija a forma das células na parte superior e direita

  2. adicionar tonalidade de cor (azul no segundo exemplo)

  3. transformá-lo em pedaços delineados (segundo exemplo)

    \begin{figure}[p]
    \begin{tikzpicture}[scale=1]
       \foreach \y in {0.1,0.2,...,.9} {
           \foreach \x in {0.1,0.2,...,.9} {
               \pgfmathparse{0.9*rnd+0.3}
               \definecolor{MyColor}{rgb}{\pgfmathresult,\pgfmathresult,\pgfmathresult}
                   \node[fill=MyColor,inner sep=0.1cm,outer sep=0pt,anchor=center] at (\x,\y) {}; 
           }
       }
    \end{tikzpicture}
    \end{figure}
    

Saída (exemplo 1):

Eu demonstro essas etapas no exemplo 2, mas só consegui fazê-lo funcionar a partir de um arquivo PDF pré-gerado:

\begin{tikzpicture}
     \node[inner sep=0pt] (tumor1to4) at (0,0) {\includegraphics[trim=0 400 400 0,clip,width=20ex,height=20ex]{Plots/Clipart/heatmap.pdf}};

     \node[right=1ex of tumor1to4,font=\fontsize{20}{0}\selectfont, thick] (el1) {...};
     
     \node[inner sep=0pt, right= 0.5ex of el1] (tumorp) {\includegraphics[trim=0 400 475 0,clip,height=20ex]{Plots/Clipart/heatmap.pdf}};
 
     \node[right=0.5ex of tumorp,font=\fontsize{20}{0}\selectfont, thick] (el2) {...};
     
     \node[inner sep=0pt, right= 0.5ex of el2] (tumorP) {\includegraphics[trim=475 400 0 0,clip,height=20ex]{Plots/Clipart/heatmap.pdf}};
 
    \node[below=3ex of tumor1to4,font=\fontsize{20}{0}\selectfont, thick, rotate=90] (el3) {...};
 
     \node[inner sep=0pt, below =5.5ex of tumor1to4] (tumorK) {\includegraphics[trim=0 300 400 178,clip,width=20ex]{Plots/Clipart/heatmap.pdf}};

     \node[right=1ex of tumorK,font=\fontsize{20}{0}\selectfont, thick] (el5) {...};
     
     \node[inner sep=0pt, right= 0.5ex of el5] (tumorKp) {\includegraphics[trim=0 300 475 178,clip,width=5ex]{Plots/Clipart/heatmap.pdf}};
 
     \node[right=0.5ex of tumorKp,font=\fontsize{20}{0}\selectfont, thick] (el6) {...};
     
     \node[inner sep=0pt, right= 0.5ex of el6] (tumorKP) {\includegraphics[trim=475 300 0 178,clip,height=5ex]{Plots/Clipart/heatmap.pdf}};
    
     \node[draw=red,size=3pt,rectangle,fit=(tumorp) (tumorKp)] {};
\end{tikzpicture}

Saída (exemplo 2):

Agora a questão é, como anotar o exemplo 1 como no exemplo 2?

Respostas

2 muzimuzhiZ Aug 18 2020 at 06:30

Em primeiro lugar, inner sep=0.1cmcada nó realmente tem tamanho de 0,2 cm x 0,2 cm. Isso causou o problema de forma das células na parte superior e à direita.

Aqui eu uso inner sep=0pt, minimum size=1cmem vez disso. Você pode escolher outra cor base e faixa de cores aleatória, em vez de bluee [-75, 75]respectivamente.

\documentclass{article}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}[inner sep=0pt, minimum size=1cm]
    \foreach \y in {1, ..., 9} {
        % add vertical shift and dots
        \ifnum\y=2\relax
          \tikzset{yshift=-1cm}
        \else
          \ifnum\y=1\relax
            \path node at (5, \y+1) {\huge$\vdots$};
          \fi
        \fi
        
        \foreach \x in {1, ..., 9} {
            % add horizontal shift and dots
            \ifnum\x<8\relax
            \else
              \tikzset{xshift=1cm*(\x-7)}
              \ifnum\y=1\relax
              \path node at (\x-1, 5) {\huge\ldots}
                    node at (\x-1, 1) {\huge\ldots};
              \fi
            \fi
            
            % get random color
            \pgfmathparse{int(150*rnd-75)} % [-75, 75]
            % color range: blue!75!white .. blue!100 .. blue!75!black
            \ifnum\pgfmathresult>0\relax
              \colorlet{MyColor}{black!\pgfmathresult!blue}
            \else
              \edef\pgfmathresult{-\pgfmathresult}
              \colorlet{MyColor}{white!\pgfmathresult!blue}
            \fi
            
            % draw filled square
            \node[fill=MyColor] at (\x,\y) {};
        }
    }
\end{tikzpicture}
\end{document}