有时在绘制图表时,您需要一定数量的不同颜色的相似对象,但数量可能会有所不同,并且您不想逐个手动定义和分配所有颜色,尤其是在迭代一组变量时。无论对象数量多少,您都希望颜色的过渡看起来平滑且间隔均匀,以便它流畅并产生自然进展的错觉。
这幅图像是用一个简单漂亮的\foreach
循环生成的。模板如下所示。
集合中的每个整数都表示为\int
,每次迭代的颜色为\hue
。的值\int
应用于每个节点的名称、相应的 x 坐标和相关文本(即圆圈内的标签)(\int) at (\int,0) {\int};
:。
这两个变量一起声明:
\foreach \int/\hue
然后在每次迭代中一起定义:
{1/red,2/orange,3/yellow,4/green,5/cyan,6/blue,7/violet}
因此与、与 等等1
相关联。red
2
orange
它可能并不完美,因为我们使用的是预定义的颜色,但你明白我的意思。可以看到类似的东西(更复杂,调节饱和度)这里,但我始终无法理解。我更喜欢只调整色调,而不是饱和度。通过!
在颜色上附加一个值,已经可以轻松调整饱和度(例如\hue!20
)。
\documentclass[margin=10]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\foreach \int/\hue in
{1/red,2/orange,3/yellow,4/green,5/cyan,6/blue,7/violet}
\node[draw,circle,color=black,fill=\hue!50]
(\int) at (\int,0) {\int};
\end{tikzpicture}
\end{document}
为了帮助说明我想要实现的目标,这里有一些参考图光彩视觉。请注意饱和度是如何均匀的,并且频谱在每个阶段都是均匀分布的。
这个想法可能最好总结如下:
自动着色可能在图形或图表应用程序中很有用,因为这些应用程序可能需要大量且未指定的颜色,而用户不想或不能指定每种单独的颜色。–xcolor 手册
这是我迄今为止最好的尝试:
\documentclass[rgb,tikz,dvipsnames,margin=10]{standalone}
\begin{document}
\definecolorseries{wheel}{hsb}{step}{OrangeRed}[hsb]{.046,0,0}
\resetcolorseries{wheel}
\begin{tikzpicture}
\foreach \int in {1,...,10}
\node[draw,circle,minimum size=22,fill=wheel!!+!50]
(\int) at (\int,0) {\int};
\end{tikzpicture}
\end{document}
答案1
请注意,blue!50
您定义的颜色是 的 50% blue
。这是一种使用 HSB 颜色模型调整色调和饱和度的非常不同的方法,我建议在这里使用这种方法。使用该xcolor
包(或 TikZ),您可以使用该模型定义颜色,该Hsb
模型采用 0 到 360 之间的数字来定义色调(您可以轻松地将其除以所需的步数),并使用 0 到 1 之间的数字来定义饱和度和亮度。
因此,也许你可以从以下方面开始:
\documentclass[margin=10]{standalone}
\usepackage[rgb]{xcolor}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\foreach \hue in {0,...,6}
\pgfmathparse{360/7*\hue}
\definecolor{current}{Hsb}{\pgfmathresult,.5,1}
\node[draw,circle,fill=current] (\hue) at (\hue,0) {\hue};
\end{tikzpicture}
\end{document}
请注意,您可能需要单独加载带有xcolor
选项的包rgb
,以将颜色转换为 RGB 模型进行输出。
车轮处理方法:
\documentclass[border=5pt]{standalone}
\usepackage[rgb]{xcolor}
\usepackage{tikz}
\newcommand{\colorring}[4][1]{
\def\segments{#2}
\def\innerrad{#3}
\def\outerrad{#4}
\foreach \x in {1,...,\segments}
\pgfmathparse{360/\segments*\x}
\definecolor{current}{Hsb}{\pgfmathresult,#1,1}
\fill[current,draw=white] (360/\segments*\x-360/\segments/2:\outerrad)
arc (360/\segments*\x-360/\segments/2:360/\segments*\x+360/\segments/2:\outerrad)
-- (360/\segments*\x+360/\segments/2:\innerrad)
arc (360/\segments*\x+360/\segments/2:360/\segments*\x-360/\segments/2:\innerrad)
-- cycle;
}
\begin{document}
\begin{tikzpicture}[scale=2, rotate=90]
\colorring{3}{0cm}{3mm}
\colorring[.9]{6}{3mm}{5mm}
\colorring[.8]{18}{5mm}{7mm}
\colorring[.7]{30}{7mm}{9mm}
\colorring[.6]{102}{9mm}{11mm}
\end{tikzpicture}
\end{document}
答案2
或者,您可以使用wave
颜色模型,它允许您通过提及纳米级别的波长来使用颜色。
\documentclass[border=10pt,rgb]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\foreach \N in {1,...,6}
\foreach \int in {1,...,\N}
\pgfmathparse{360+int(\int*400/\N)}
\providecolor{bar}{wave}{\pgfmathresult}
\node[draw,circle,fill=bar!50] (\int) at (\int,-\N) {\int};
\end{tikzpicture}
\end{document}