径向图中的二进制扇区叠加图

径向图中的二进制扇区叠加图

我正在分析来自可能具有某些二进制配置的系统的一些数据。我认为一个好的策略是将输出可视化为径向图并将其二进制配置(如扇区)叠加,如图所示。

在此处输入图片描述

我的问题是,我正在尝试自动化绘制彩色扇区的部分。是否有任何 TikZ 软件包可以简化我的生活?是否有任何软件包允许将数字(在本例中为 1..7)转换为二进制,然后检查二进制字符串以相应地为扇区着色?

我以为在示例网站中我会找到一些二进制编码来生成图案,例如用于生成图中光学编码器的图案,但我没有找到。虽然有一个达达板,但问题不同,着色是手动完成的。在此处输入图片描述

答案1

编辑:我稍微(或很大程度上)误解了 OP 的要求。原始答案在底部。

这个答案需要PGF 的最新 CVS 版本针对新math库。请注意,由于这还不是正式发布的一部分,因此可能会(但不太可能)发生变化。

\documentclass[border=0.5cm]{standalone}
\usepackage{tikz}
\usetikzlibrary{math}
\renewcommand{\familydefault}{\sfdefault}
\begin{document}

\begin{tikzpicture}
\tikzmath{
    int \nbits, \p, \q, \N, \n;
    \nbits = 3;
    \p = 2^\nbits;
    \s = (360/\p);
    \r = 1;
    \t = 0.5;
    for \N in {0,...,\p-1}{ 
        \n = \N;
        {
            \node [font=\tiny, anchor=\N*\s+\s/2] at (\N*\s+\s/2:\r) {\N};
        };
        for \i in {0, ..., \nbits-1}{
            \q = 2^(\nbits-\i-1);
            if int(\n/\q) > 0 then {
                let \c = black;
                \n = \n - \q;
            } else {
                let \c = white;
            };
            \R = \r + \t*(\nbits- \i - 1);
            \a = \N*\s;
            \b = \a + \s;
            {
                \path [fill=\c, draw=black!75, very thick] 
                    (\a:\R) arc (\a:\b:\R) -- (\b:\R+\t) arc (\b:\a:\R+\t) -- cycle;
            };
        };
    };
}
\end{tikzpicture}

\end{document}

在此处输入图片描述

编辑:这个答案的其余部分是最初的(错误)答案。

\pgfmathparse一切都可以使用和来完成\foreach,但该math库旨在使多个分配更清晰一些。此外,此答案不包括在顶部添加径向图。pgfplots希望有更多通用解决方案(例如,使用 )。

\documentclass[border=0.5cm]{standalone}
\usepackage{tikz}
\usetikzlibrary{math}
\renewcommand{\familydefault}{\sfdefault}
\begin{document}

\begin{tikzpicture}
\tikzmath{
    int \nbits, \n, \q;
    \nbits = 8;
    \s = (360/\nbits);
    \r1 = 1;
    \r2 = 1.5;
    \k = 0;
    for \n in {0,1,2,4,8,16,32,64,128,15,33,65,163,211,244,255}{
        \x = mod(\k, 4);
        \y = int(\k/4);
        \k = \k + 1;
        {
            \node at (\x*4,-\y*4) {\n};
        };
        for \i in {0, ..., \nbits-1}{
            \q = 2^(\nbits-\i-1);
            if int(\n/\q) > 0 then {
                let \c1 = black;
                let \c2 = white;
                \n = \n - \q;
            } else {
                let \c1 = white;
                let \c2 = black;
            };
            \a = \s * \i;
            \b = \a + \s;
            {
                \begin{scope}[shift={(\x*4,-\y*4)}]
                    \path [fill=\c1, draw=black!75, very thick] 
                        (\a:\r1) arc (\a:\b:\r1) -- (\b:\r2) arc (\b:\a:\r2) -- cycle;
                    \node [font=\tiny, text=\c2] at (\a+\s/2:\r1/2+\r2/2) {\q};
                \end{scope}
            };
        };
    };
}
\end{tikzpicture}

\end{document}

在此处输入图片描述

通过一些细微的调整,可以得到“飞镖”图案:

\documentclass[border=0.5cm]{standalone}
\usepackage{tikz}
\usetikzlibrary{math}
\renewcommand{\familydefault}{\sfdefault}
\begin{document}

\begin{tikzpicture}
\tikzmath{
    int \nbits, \n, \q;
    \nbits = 8;
    \s = (360/\nbits);
    \r1 = 2;
    \r2 = 2.5;
    for \n in {65,163,211,244,255}{ \k = 0;
        for \i in {0, ..., \nbits-1}{
            \q = 2^(\nbits-\i-1);
            if int(\n/\q) > 0 then {
                let \c1 = black;
                \n = \n - \q;
            } else {
                let \c1 = white;
            };
            \a = \s * \i;
            \b = \a + \s;
            {               
                    \path [fill=\c1, draw=black!75, very thick] 
                        (\a:\r1) arc (\a:\b:\r1) -- (\b:\r2) arc (\b:\a:\r2) -- cycle;
            };
        };
        \r1 = \r2;
        \r2 = \r2 + 0.5;
    };
    for \i in {0, ..., \nbits-1}{
        \a = (360/\nbits) * (\i);
        \q = 2^(\nbits-\i-1);
        {
            \node [font=\tiny] at (\a+\s/2:1.625) {\q};
        };
    };
}
\end{tikzpicture}

\end{document}

在此处输入图片描述

答案2

这是一个使用\pgfmathparse\foreachbitset 的解决方案bitset包裹

\documentclass[tikz,convert]{standalone}
\usepackage{tikz}
\usepackage{bitset}


\begin{document}
\begin{tikzpicture}

\tikzset{
    % argumentss = {initialAngle, radiousOffset, sectorAngleSize, thickness}
    sect/.style args={#1:#2:#3:#4}{
    insert path={   +(#1:#2) arc (#1:{#1+#3}:#2)  
                 -- +({#1+#3}:#4) arc ({#1+#3}:#1:{#2+#4}) 
                 -- cycle     }
  }
}
\tikzset{activeSector/.style={very thin, fill=black!20}}
\tikzset{inactiveSector/.style={very thin}}


\def\numBits{3}
\def\initialRadious{2}
\def\sectorThickness{.5}
\pgfmathsetmacro{\numSectors}{(2^\numBits)-1}
\pgfmathsetmacro{\maxIdxNumBits}{\numBits-1}
\pgfmathsetmacro{\sectorSize}{360/\numSectors}


\foreach \x [count=\n] in {1,...,\numSectors}
{
    \pgfmathsetmacro{\currentAngle}{\sectorSize*\x}
    \bitsetSetDec{xInbin}{\x}
    \foreach \bitId in {0,...,\maxIdxNumBits}
    {
        \pgfmathsetmacro{\currentRadious}{\initialRadious+\sectorThickness*(\bitId-1)}
        \pgfmathparse{\bitsetGet{xInbin}{\bitId})}
        \ifnum\pgfmathresult>0      
                    \draw[activeSector] (0,0) [sect=\currentAngle:
                                                    \currentRadious:
                                                    \sectorSize:
                                                    \sectorThickness];
        \else
                    \draw[inactiveSector] (0,0) [sect=\currentAngle:
                                                    \currentRadious:
                                                    \sectorSize:
                                                    \sectorThickness];
        \fi
    }
}

\end{tikzpicture}
\end{document}

在此处输入图片描述

答案3

轮图我写的包,可以使用。

环的数量由 决定\n。每个环中的切片数为 ,2^\n并将其传递给密钥total count

切片的颜色(blackwhite)由键决定slices style

在此处输入图片描述

\documentclass[border=6pt]{standalone}
\usepackage{wheelchart}
\begin{document}
\begin{tikzpicture}
\def\n{4}
\foreach\i in {1,...,\n}{
  \wheelchart[
    radius={\i+1}{\i+2},
    slices style={
      /utils/exec={
        \pgfmathparse{Mod(int((\WCcount-1)/(2^(\i-1))),2)==0?"black":"white"}
        \edef\WCcolor{\pgfmathresult}
      },
      \WCcolor,
      draw=gray,
      ultra thick
    },
    start angle=0,
    total count=2^\n
  ]{}
}
\end{tikzpicture}
\end{document}

相关内容