# Visualize sparsity pattern with TikZ

I have a huge sparse matrix of about 10.000 x 10.000 entries with 60.000 non-zero entries. I'd like to visualize the pattern, that means zero entries are ignored and non-zero entries are marked with a small circle, maybe colored by its value.

Just printing a pixel for each entry is not enough, as the image would be scaled down and the result barely visible.

Something like Matlab's spy function would be great.

• spy in matlab and \includegraphics? – percusse Jan 11 '17 at 9:57
• @percusse Definitely not. I'd like to load the data from an external file and make all the processing / visalization with TikZ. That can be scripted, is better in a version control etc. – usr1234567 Jan 11 '17 at 10:03
• That big matrix is just impossible with TeX. – percusse Jan 11 '17 at 10:04
• I would generate a file with 60000 lines with x,y,value entries (with a script or whatever) and then try to plot a scatter graphic. Disclaimer: I do not know if 60k line is manageable... never tried. – Rmano Jan 11 '17 at 10:23

Something to try on. It uses tikz and pgfplotstable to fetch the data. It iterates through the table, tough you have to inform the table size beforehand in \nrows and \ncols. I have no idea about performance for big data sets, likely it will be bad (as expected).

The relationship between value and Format/Color is yours to make. Though as percusse said, 10 000x 10 000 Matrix is just too big...

# MWE

\documentclass[margin=3mm]{standalone}
\usepackage{tikz,pgfplotstable,filecontents}
\begin{filecontents}{data-table.dat}
1   2   3   4   5
6   6   8   5   4
1   0   8   5   1
1   2   0   4   5
6   6   8   5   4
1   0   8   5   1
\end{filecontents}
\def\nrows{5}
\def\ncols{4}
\begin{document}
\begin{tikzpicture}
\foreach \i in {0,...,\nrows}{
\foreach \j in {0,...,\ncols}{
\pgfplotstablegetelem{\i}{\j}\of\mytable
\ifnum\pgfplotsretval=0\relax\else
\node[circle, minimum size=.5pt, inner sep=0pt, fill=red!\pgfplotsretval!purple, opacity=0.\pgfplotsretval] at (\j pt,-\i pt) {};
\fi
};
};
\end{tikzpicture}
\end{document}


Making a 60x60 Matrix with "random" integers from 0 to 50 and using the above MWE I got this: