我有一个维恩图,其中有一些重叠的椭圆,我用线将它们分成几部分。
我想用它来制作一些图形,我想知道是否有一个聪明/干净的方法来做到这一点。
我有以下问题:
部分首先,我想分割图中由线条交叉点创建的每个空间(标记为槽 h)。
合并接下来,我想制作一些图来突出显示不同的合并。例如,我有一个图,其中 a 为红色,b 为绿色,d+c 为黄色。我计划让所有段的轮廓仍然可见(d 和 c 仍然有一条单独的线),但 alpha 值较低。
标签如果能使用 tikz magic 进行自动标记就好了。具体来说,如果能自动将标签置于每个部分的中心,或者能够指定一些文本精确地位于某些部分的上方中心,那就太好了。
方法 对我来说,最理智的解决方案似乎是“声明”一次片段,然后使用片段名称来阴影化/勾勒/标记它们。
我对 tikz 的使用经验不多,所以我不知道这是否真的是最好的方法。我使用 tikz 的唯一经验是制作图形,但我并不完全理解图形中节点和其他类型对象的概念。
\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}
找到解决方案
我意识到这是一个非常具体的问题,我并不期望有一个完全编码的解决方案,但是关于如何解决这个问题的任何指导都会很棒!:)
希望有人能帮助我!:)
编辑:我想要进行的所有合并也可以通过剪辑来完成(例如,对于 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}