我正在分析来自可能具有某些二进制配置的系统的一些数据。我认为一个好的策略是将输出可视化为径向图并将其二进制配置(如扇区)叠加,如图所示。
我的问题是,我正在尝试自动化绘制彩色扇区的部分。是否有任何 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
和\foreach
bitset 的解决方案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
。
切片的颜色(black
或white
)由键决定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}