绘制一个非常大的二进制矩阵作为彩色网格

绘制一个非常大的二进制矩阵作为彩色网格

我有一个 50x300 的二进制矩阵,我想将其显示为彩色网格。我尝试了以下方法绘制大型二进制矩阵作为彩色网格我喜欢,但是

  • 使用 pgfplots 表的方法太大,resizebox 会导致内存不足错误,我找不到合适的解决方案来调整 pgfplotsset 中表格的单元格大小。将字体大小设置为尽可能小是不够的,并且
  • tikz-matrix 方法导致编译超时。

我现在真的不知道该怎么办。增加内存分配对我来说似乎太过复杂了,难道没有更优雅的选择吗?我也想坚持使用 pgfplots 方法。

答案1

如果你追求效率,通常情况下,原始函数更好。注意,Op这个问题在解决方案中指定 tikz。

\documentclass{standalone}
\usepackage{xcolor}

\newlength{\cellwidth}
\newlength{\cellheight}
\let\END=\eof

\newcommand{\colormatrix}[1]% #1 = binary matrix
{\parbox{\CMcolumns\cellwidth}{%
  \baselineskip=\cellheight
  \lineskip=0pt
  \def\one{1}%
  \def\zero{0}%
  \bgroup
    \countdef\col=1
    \col=0
    \CMParse#1\END
  \egroup
}}

\def\CMParse#1{\ifx#1\END\else
  \if#1\one\relax{\color{\onecolor}\rule{\cellwidth}{\cellheight}}\fi
  \if#1\zero\relax{\color{\zerocolor}\rule{\cellwidth}{\cellheight}}\fi
  \advance\col by 1
  \ifnum\col<\CMcolumns\relax\else
    \hfil
    \col=0
  \fi
\expandafter\CMParse\fi}% expand \fi first

\newcommand{\setcolormatrix}[6]% #1=width, #2=height, #3=number columns, #4=number rows, #5=one color, #6=zero color
{\global\cellwidth=\dimexpr #1/#3\relax
 \global\cellheight=\dimexpr #2/#4\relax
 \global\def\CMcolumns{#3}%
 \global\def\onecolor{#5}%
 \global\def\zerocolor{#6}%
}

\begin{document}
\setcolormatrix{1in}{1in}{11}{7}{blue}{yellow}%
\colormatrix{%
10110101010
10010101010
01010111010
11110010100
01100011001
11101010111
10101010111}

\end{document}

二进制矩阵


该文件image.tex(由编辑器创建)包括

10110101010
10010101010
01010111010
11110010100
01100011001
11101010111
10101010111

更新后的解为

\documentclass{standalone}
\usepackage{xcolor}

\newlength{\cellwidth}
\newlength{\cellheight}
\newread\imagefile
\let\END=\eof

\newcommand{\colormatrix}[1]% #1 = filename
{\parbox{\CMcolumns\cellwidth}{%
  \baselineskip=\cellheight
  \lineskip=0pt
  \def\one{1}%
  \def\zero{0}%
  \def\empty{\par}%
  \openin\imagefile=#1
  \loop\ifeof\imagefile\else
    \read\imagefile to \buffer%
    \ifx\buffer\empty\relax\else
      \expandafter\CMParse\buffer\END
      \hfil
    \fi
  \repeat
  \closein\imagefile
}}

\long\def\CMParse#1{\ifx#1\END\else
  \if#1\one\relax{\color{\onecolor}\rule{\cellwidth}{\cellheight}}\fi
  \if#1\zero\relax{\color{\zerocolor}\rule{\cellwidth}{\cellheight}}\fi
\expandafter\CMParse\fi}% expand \fi first

\newcommand{\setcolormatrix}[6]% #1=width, #2=height, #3=number columns, #4=number rows, #5=one color, #6=zero color
{\global\cellwidth=\dimexpr #1/#3\relax
 \global\cellheight=\dimexpr #2/#4\relax
 \global\def\CMcolumns{#3}%
 \global\def\onecolor{#5}%
 \global\def\zerocolor{#6}%
}

\begin{document}
\setcolormatrix{1in}{1in}{11}{7}{blue}{yellow}%
\colormatrix{image}

\end{document}

答案2

这是MWE使用Asymptote

在此处输入图片描述

示例 30x500 文件是使用

// 
// "gendata.asy" :
//
int m=30, n=500;
file fout=output("binmatrix.txt");
srand(1717177);
string s;
for(int i=0;i<m;++i){
  s="";
  for(int j=0;j<n;++j){
    s+=string(round(unitrand()));
  }
  write(fout,s+'\n');
}
flush(fout);
close(fout);

Asymptote图像的代码是

//
// "m1.asy" :
// 
settings.tex="pdflatex";
file fin=input("binmatrix.txt"); 

string[] s=fin;

int m=s.length, n=length(s[1]);

real h=1cm;
real w=h/m*n;
size(w,h);

import graph;
import palette;
real[][] v=new real[n][m];
for(int i=0; i < m; ++i){
  for(int j=0; j < n; ++j){
    v[j][i]=(real)substr(s[i],j,1);
  }
}
pen[] Palette=new pen[]{deepblue,orange};
bounds range=image(v,(0,0),(n,m),Palette);

您还可以将位组合成颜色,例如像这样:

settings.tex="pdflatex";
file fin=input("binmatrix.txt"); 

string[] s=fin;

int m=s.length, n=length(s[1]);

real h=1cm;
real w=h/m*n/3;
size(w,h);

import graph;
import palette;
pen[][] v=new pen[(int)(n/3)][m];
for(int i=0; i < m; ++i){
  for(int j=0; j < (int)(n/3); ++j){
    v[j][i]=rgb((real)substr(s[i],3*j,1),(real)substr(s[i],3*j+1,1),(real)substr(s[i],3*j+2,1));;
  }
}
image(v,(0,0),(n/3,m)); 

在此处输入图片描述

答案3

您可以考虑使用imagemagick。例如,您可以将数据格式化为纯文本PGM 格式

文件“sample.pgm”

P2
8 8
1
0 0 0 0 0 0 0 0
0 1 1 1 1 1 1 0
0 1 0 0 0 0 1 0
0 1 0 1 1 0 1 0
0 1 0 1 1 0 1 0
0 1 0 0 0 0 1 0
0 1 1 1 1 1 1 0
0 0 0 0 0 0 0 0

imagemagick使用以下命令进行转换。

convert sample.pgm -scale 320x320 sample.bmp

产生以下位图。

在此处输入图片描述

答案4

我认为,使用\pdfliteral来生成内嵌图像是最有效的方法。

缺点是每个小方块由两个字符表示。

这个想法来自于这个问题:通过 \pdfliteral 包含 PDF

\pdfcompresslevel0
\documentclass{article}
\begin{document}
\hbox to 10cm{%
    \immediate\pdfliteral{
        q
            11 0 0 7 0 0 cm            % input width = 11px;
                                       % input height = 7px
            10 0 0 3 0 0 cm            % output width = 10cm
                                       % output height = 3cm
            2.57693 0 0 2.57693 0 0 cm % magic number
            BI
                /W 11                  % input width = 11px;
                /H 7                   % input height = 7px
                /CS [
                    /Indexed /RGB
                    1                  % = using 2 colors
                                       % maximal is 255 = using 256 colors
                    <FF0000 0000FF>    % red and blue
                ]
                /BPC 8
                /F /AHx
                /I false
            ID
                01 00 01 01 00 01 00 01 00 01 00
                01 00 00 01 00 01 00 01 00 01 00
                00 01 00 01 00 01 01 01 00 01 00
                01 01 01 01 00 00 01 00 01 00 00
                00 01 01 00 00 00 01 01 00 00 01
                01 01 01 00 01 00 01 00 01 01 01
                01 00 01 00 01 00 01 00 01 01 01
                >
            EI
        Q
    }
    \hfill
}\vbox to3cm{}

\bigskip

\end{document}

相关内容