着色图 tikz

着色图 tikz

我想给完整的图表上色。但是,区域的填充覆盖了边缘和其他颜色。最好的办法是,当区域重叠时,颜色可以“混合”,同时显示边缘。这可能吗?至少可以通过这种笨拙的着色显示边缘吗?代码如下(我在这里找不到任何好的图片 - 感谢建议)。

\begin{center}
\begin{eqnarray*}
\begin{tikzpicture}
    \tikzstyle{vertex} = [draw,circle,fill=black,inner sep = 1.5pt]
    \node[vertex] (1) [label = above: $a$] at (0,2) {};
    \node[vertex] (2) [label = below: $b$] at (1,-1/2) {};
    \node[vertex] (3) [label = below: $c$] at (-1,-1/2) {};
    \node[vertex] (4) [label = above: $f$] at (2,5) {};
    \node[vertex] (5) [label = below: $g$] at (-4,3/2) {};
    \node[vertex] (6) [label = below: $h$] at (4,-3) {};

    \draw [] (0,2) -- (1,-1/2) -- (-1,-1/2) -- cycle;
    \draw [fill = yellow] (0,2) -- (-1,-1/2) -- (2,5) -- cycle  
    (0,2) -- (1,-1/2) -- (2,5) -- cycle
    (1,-1/2) -- (-1,-1/2) -- (2,5) -- cycle;

    \draw [fill = lime] (0,2) -- (1,-1/2) -- (-4,3/2) -- cycle
    (0,2) -- (-1,-1/2) -- (-4,3/2) -- cycle
    (1,-1/2) -- (-1,-1/2) -- (-4,3/2) -- cycle;


    \draw (6) to [bend left] (5);
  \end{tikzpicture}
\end{eqnarray*}
\end{center}

提前致谢。

答案1

最简单的方法就是,如上所述,仅指定opacity=<degree>不透明度的范围从零(透明)到 1(不透明)。fill opacity仅适用于填充、draw opacity仅适用于绘图和text opacity仅适用于文本。

但是,我不会将其应用于fill opacity整个图片,因为它也会应用于填充的黑色圆圈,而这可能不是您想要的。相反,只将其应用于为图表着色的命令。

例如(改变颜色以使效果更明显):

...
  \draw  (0,2) -- (1,-1/2) -- (-1,-1/2) -- cycle;
  \draw [fill = magenta, fill opacity=.5] (0,2) -- (-1,-1/2) -- (2,5) -- cycle (0,2) -- (1,-1/2) -- (2,5) -- cycle (1,-1/2) -- (-1,-1/2) -- (2,5) -- cycle;
  \draw [fill = cyan, fill opacity=.5] (0,2) -- (1,-1/2) -- (-4,3/2) -- cycle (0,2) -- (-1,-1/2) -- (-4,3/2) -- cycle (1,-1/2) -- (-1,-1/2) -- (-4,3/2) -- cycle;
  \draw (6) to [bend left] (5);
...

填充 1

这可能是你想要的,也可能不是。如果是,你可以停止阅读,去和猫一起玩*。

如果您不想要不透明,而只想混合颜色,则可以使用除 之外的混合模式normal。默认情况下,当您在现有的彩色像素上绘制新的完全不透明像素时,新颜色会取代旧颜色。但是,这不是唯一的可能性。例如,另一个选项是使用overlay混合。

...
  [
    vertex/.style = {% \tikzstyle is deprecated
      draw,
      circle,
      fill=black,
      inner sep = 1.5pt,
    },
    blend group=overlay,
  ]
  \draw [fill = magenta] (0,2) -- (-1,-1/2) -- (2,5) -- cycle (0,2) -- (1,-1/2) -- (2,5) -- cycle (1,-1/2) -- (-1,-1/2) -- (2,5) -- cycle;
  \draw [fill = cyan] (0,2) -- (1,-1/2) -- (-4,3/2) -- cycle (0,2) -- (-1,-1/2) -- (-4,3/2) -- cycle (1,-1/2) -- (-1,-1/2) -- (-4,3/2) -- cycle;
  \draw (6) to [bend left] (5);
...

叠加混合

您可能会发现一些不满意的地方。一是下面的黑线虽然可见,但仍有部分被遮盖。二是一些填充物变得不透明或着色加倍(或更多)。有时这是您想要的。有时不是。

你可能正在寻找的是这样的:

最终图表

  1. 在这种情况下,首先在图片的主层上绘制并标记节点,同时用坐标定义相关点,原因我认为Heiko 解释道当我在提问关于它,打击乐很好心地回答,尽管这可能是一个愚蠢的问题。

  2. background然后使用该库在图层上填充颜色backgrounds,以便它们不会遮挡节点。

  3. 最后,利用坐标在主层上绘制线条。

为了更容易跟踪,相关坐标使用相应顶点的标签来命名。

\documentclass[tikz,border=10pt,multi]{standalone}
\usetikzlibrary{backgrounds}
\begin{document}
\begin{tikzpicture}
  [
    vertex/.style = {%
      draw,
      circle,
      fill=black,
      inner sep = 1.5pt,
    },
  ]
  \foreach \i/\k/\m [count=\j] in {(0,2)/a/above, (1,-.5)/b/below, (-1,-2)/c/below, (2,5)/f/above, (-4,-1.5)/g/below, (4,-3)/h/below}
  {
    \node [coordinate] (\k) at \i {} ;
    \node [vertex, label=\m:$\k$] at (\k) {};
  }
  \draw  (a) -- (b) -- (c) -- cycle;
  \begin{scope}[on background layer]
    \begin{scope}[blend group=overlay]
      \fill [magenta] (a) -- (c) -- (b) -- (f) -- cycle;
      \fill [cyan] (a) -- (b) -- (c) -- (g) -- cycle;
    \end{scope}
  \end{scope}
  \draw (a) -- (c) -- (f) -- cycle (a) -- (b) -- (f) -- cycle (b) -- (c) -- (f) -- cycle (a) -- (b) -- (g) -- cycle (a) -- (c) -- (g) -- cycle (b) -- (c) -- (g) -- cycle (h) to [bend left] (g);
\end{tikzpicture}
\end{document}

我喜欢这个版本,因为它提供的颜色看起来几乎是半透明的,并且以直观的方式自动混合它们。(也就是说,我不必手动混合颜色,也不会得到使用透明度时得到的暗淡和意想不到的效果。)当然,您的公里数可能会有很大差异。


  • 不包括猫。

答案2

绘制和填充的顺序很重要。首先应该填充区域,然后才能在其上绘制线条。

由于非零填充规则,黄色区域未完全填充,pgf详情请参阅手册。简而言之,第一个黄色三角形的角按逆时针顺序排列,第三个三角形的角按顺时针顺序排列。如果要合并区域,请使用相同的顺序。

以下示例简化了填充和绘制。首先定义坐标(稍后用坐标代替明确的数字)。然后将填充的三角形合并为三个区域:黄色区域、黄绿色区域和交叉区域,其中颜色由两种颜色组成。然后绘制线条,首先是外线,然后是内连接线,无需绘制两次线条并避免尖角。

\documentclass{article}
\usepackage{tikz}
\begin{document}
  \begin{tikzpicture}

    \path
      ( 0,  2)   coordinate (a)
      ( 1, -0.5) coordinate (b)
      (-1, -0.5) coordinate (c)
      ( 2,  5)   coordinate (f)
      (-4,  1.5) coordinate (g)
      ( 4, -3)   coordinate (h)
    ;

    \fill [yellow]         (a) -- (b) -- (f) -- cycle;
    \fill [lime]           (a) -- (g) -- (c) -- cycle;
    \fill [yellow!50!lime] (a) -- (b) -- (c) -- cycle;

    \draw
      (a) -- (f) -- (b) -- (c) -- (g) -- cycle
      (a) -- (c)
      (a) -- (b)
      (c) -- (f)
      (b) -- (g)
      (h) to [bend left] (g);

    \tikzstyle{vertex} = [draw,circle,fill=black,inner sep = 1.5pt]
    \node[vertex] [label = above: $a$] at (a) {};
    \node[vertex] [label = below: $b$] at (b) {};
    \node[vertex] [label = below: $c$] at (c) {};
    \node[vertex] [label = above: $f$] at (f) {};
    \node[vertex] [label = below: $g$] at (g) {};
    \node[vertex] [label = below: $h$] at (h) {};


  \end{tikzpicture}
\end{document}

结果

答案3

要混合颜色,您可以使用透明度。类似于opacity=0.5整个图片,但还有更多可能性。但是,黄绿色和黄色非常相似,混合效果不太好。

在此处输入图片描述

\documentclass{article}

\usepackage{tikz}

\begin{document}

\begin{center}
\begin{tikzpicture}[fill opacity=0.5]
    \tikzstyle{vertex} = [draw,circle,fill=black,inner sep = 1.5pt]
    \node[vertex] (1) [label = above: $a$] at (0,2) {};
    \node[vertex] (2) [label = below: $b$] at (1,-1/2) {};
    \node[vertex] (3) [label = below: $c$] at (-1,-1/2) {};
    \node[vertex] (4) [label = above: $f$] at (2,5) {};
    \node[vertex] (5) [label = below: $g$] at (-4,3/2) {};
    \node[vertex] (6) [label = below: $h$] at (4,-3) {};

    \draw [] (0,2) -- (1,-1/2) -- (-1,-1/2) -- cycle;
    \draw [fill = yellow] (0,2) -- (-1,-1/2) -- (2,5) -- cycle  
    (0,2) -- (1,-1/2) -- (2,5) -- cycle
    (1,-1/2) -- (-1,-1/2) -- (2,5) -- cycle;

    \draw [fill = lime] (0,2) -- (1,-1/2) -- (-4,3/2) -- cycle
    (0,2) -- (-1,-1/2) -- (-4,3/2) -- cycle
    (1,-1/2) -- (-1,-1/2) -- (-4,3/2) -- cycle;


    \draw (6) to [bend left] (5);
  \end{tikzpicture}
 \end{center}

\end{document}

相关内容