在复杂的维恩图中阴影圆段

在复杂的维恩图中阴影圆段

我有一个维恩图,其中有一些重叠的椭圆,我用线将它们分成几部分。

我想用它来制作一些图形,我想知道是否有一个聪明/干净的方法来做到这一点。

我有以下问题:

  1. 部分首先,我想分割图中由线条交叉点创建的每个空间(标记为槽 h)。

  2. 合并接下来,我想制作一些图来突出显示不同的合并。例如,我有一个图,其中 a 为红色,b 为绿色,d+c 为黄色。我计划让所有段的轮廓仍然可见(d 和 c 仍然有一条单独的线),但 alpha 值较低。

  3. 标签如果能使用 tikz magic 进行自动标记就好了。具体来说,如果能自动将标签置于每个部分的中心,或者能够指定一些文本精确地位于某些部分的上方中心,那就太好了。

  4. 方法 对我来说,最理智的解决方案似乎是“声明”一次片段,然后使用片段名称来阴影化/勾勒/标记它们。

    我对 tikz 的使用经验不多,所以我不知道这是否真的是最好的方法。我使用 tikz 的唯一经验是制作图形,但我并不完全理解图形中节点和其他类型对象的概念。

以下由 LaTeX 代码创建的维恩图

\begin{tikzpicture}[line/.style={line width = 2pt}]
\draw[line, red] (0,0) ellipse (6 and 4);
\draw[line, blue] (-2,0) ellipse (2 and 3);
\draw[line, green] (1.5,-1.7) ellipse (3 and 1.5); 

\node at (-2, 2.5) {a};
\draw[line, blue] (-3.5,2) -- (-0.5,2);

\node at (-2, 1.2) {b};
\draw[line, blue] (-4,0.6) -- (0,0.6);

\node at (-2, -1.2) {c};
\node at (-3.4, -1.2) {d};
\draw[line, blue] (-3,0.6) -- (-3,-2.6);

\node at (-0.5, -0.9) {e};
\node at (-1, -1.6) {f};
\draw[line, orange] (-1.2,-1) -- (-0.2,-1.3);

\node at (1, -1.6) {g};
\node at (3.2, -1.6) {h};
\draw[line, green] (2.5, -0.3) -- (2.5, -3.2);

\end{tikzpicture}

找到解决方案

  • 1。这似乎并没有真正创建节点,它只是填充了一个部分。
  • 23这个看起来非常接近我想要的,圆圈的“定义”与我想要的一样。我可能需要将线条转换为矩形才能进行交叉,但我不确定这样做的最简洁方法是什么。

我意识到这是一个非常具体的问题,我并不期望有一个完全编码的解决方案,但是关于如何解决这个问题的任何指导都会很棒!:)

希望有人能帮助我!:)

编辑:我想要进行的所有合并也可以通过剪辑来完成(例如,对于 d+c,只需用底部水平线剪辑蓝色圆圈),所以如果无法合并,那也没关系。

答案1

您可以用path picture任意内容填充路径,并将其剪切到原始路径。这有帮助吗?

\documentclass[tikz,border=2mm]{standalone} 
\usetikzlibrary{positioning, shapes.geometric}

\begin{document}
\begin{tikzpicture}

\draw[blue] (0,0) ellipse(2cm and 3cm)
    [path picture={
         \node[draw=blue, minimum width=4cm, minimum height=1.5cm, fill=blue!30, anchor=north] at (path picture bounding box.north) (a) {a};
         \node[draw=blue, minimum width=4cm, minimum height=1.5cm, fill=green!30, below=0pt of a] (b) {b};
         \node[draw=blue, minimum width=3cm, minimum height=3cm, fill=red!30, below right=0pt and -1cm of b.south] (c) {c};
         \node[draw=blue, minimum width=1cm, minimum height=3cm, fill=orange!30, left=0pt of c] (d) {d};
         }  
    ];
\end{tikzpicture}
\end{document}

在此处输入图片描述

更新:

在前面的例子中,椭圆是用path命令绘制的,矩形nodes是用选项绘制的path picture

在下面的代码中,我更改了椭圆节点的路径。这样就可以使用节点边界上的坐标轻松定义绘制和填充矩形的坐标,但仍然使用选项path picture让所有这些矩形都被节点边界剪裁。

一旦绘制了两个椭圆,并定义和填充了扇区,我们就可以开始寻找相交区域。首先,我们在intersection库的帮助下找到两个交点。但要填充椭圆相交点,我们需要定义相交区域。这可以通过两个剪切路径来完成,每个剪切路径都像原始节点一样定义。在这个范围内,我们填充了两个扇区。但由于这种填充覆盖了之前绘制的椭圆的一部分,我们需要重新绘制它们。

最后,可以用特定尺寸或使用节点绘制椭圆fit。由于此节点也已填充,因此已将其绘制在背景层上。

\documentclass[tikz,border=2mm]{standalone} 
\usetikzlibrary{positioning, shapes.geometric, intersections, fit, backgrounds}

\begin{document}

\begin{tikzpicture}

\node[draw=blue, ellipse, minimum width=4cm, minimum height=6cm,
    name path=A,
    path picture={
        \draw[blue, fill=blue!30] (A.40) rectangle (A.140|-A.north) node[pos=0.5] {a};
        \draw[blue, fill=red!30] (A.5) rectangle (A.175|-A.140) node[pos=0.5] {b};
        \draw[blue, fill=green!30] ([xshift=1cm]A.175) coordinate (aux) rectangle (A.south-|A.west) node[pos=0.5, yshift=5mm] {d};
        \draw[blue, fill=orange!30] (aux) rectangle (A.south-|A.east) node[pos=0.3] {c};
         }  
    ] at (-2,0) (A) {};

\node[draw=green!80!black, ellipse, minimum width=6cm, minimum height=3cm,
    name path=B,
    path picture={
        \draw[green!80!black, fill=green!10] (B.80) rectangle (B.-80-|B.east) node[pos=0.5] {h};
        \draw[green!80!black, fill=brown!30] (B.80) rectangle (B.south-|B.west) node[pos=0.4] {g};
         }  
    ] at (1.5,-1.7) (B) {};

\path [name intersections={of=A and B}];

\begin{scope}
\clip (-2,0) ellipse (2 and 3);
\clip (1.5,-1.7) ellipse (3 and 1.5);

\fill[cyan!50] (intersection-1) |- (A.-30) coordinate (auxA) -- (B.160) coordinate (auxB) |- cycle;
\node[blue] at (barycentric cs:intersection-1=1,auxA=1,auxB=1) {e};

\fill[cyan!30] (intersection-2) -| (auxA) -- (auxB) -| (B.west) |- cycle;
\node[blue] at (barycentric cs:intersection-2=1,auxA=1,auxB=1) {f};

\draw[brown!70!black, name path=C] (auxB)--(auxA);
\end{scope}

\draw[blue] (-2,0) ellipse (2 and 3);
\draw[green] (1.5,-1.7) ellipse (3 and 1.5);


\begin{scope}[on background layer]
\node[ellipse, draw=red, fit=(A) (B), fill=red!5, inner sep=0pt] {};
\end{scope}

\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容