我知道tikz
它可以用来生成图表,我也熟悉了生成轴和添加坐标的基础知识,但我不知道如何得到这样的图形,即使它本质上只是一堆线。有人能给我建议吗?或者我应该使用其他程序来绘制这样的图表。
答案1
以下代码应该可以帮助您入门。由于我假设您是 tikz 初学者,因此我将在代码后提供一些基本解释:
代码
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{decorations.pathmorphing}
\begin{document}
\begin{tikzpicture}
\node (I) at ( 4,0) {I};
\node (II) at (-4,0) {II};
\node (III) at (0, 2.5) {III};
\node (IV) at (0,-2.5) {IV};
\path % Four corners of left diamond
(II) +(90:4) coordinate[label=90:$i^+$] (IItop)
+(-90:4) coordinate[label=-90:$i^-$] (IIbot)
+(0:4) coordinate (IIright)
+(180:4) coordinate[label=180:$i^0$] (IIleft)
;
\draw (IIleft) --
node[midway, above left] {$\cal{J}^+$}
node[midway, below, sloped] {$\bar{u}=\infty$}
(IItop) --
node[midway, below, sloped] {$\bar{u}=0$}
(IIright) --
node[midway, below, sloped] {$\bar{u}=0$}
(IIbot) --
node[midway, above, sloped] {$\bar{v}=-\infty$}
node[midway, below left] {$\cal{J}^-$}
(IIleft) -- cycle;
\path % Four conners of the right diamond (no labels this time)
(I) +(90:4) coordinate (Itop)
+(-90:4) coordinate (Ibot)
+(180:4) coordinate (Ileft)
+(0:4) coordinate (Iright)
;
% No text this time in the next diagram
\draw (Ileft) -- (Itop) -- (Iright) -- (Ibot) -- (Ileft) -- cycle;
% Squiggly lines
\draw[decorate,decoration=zigzag] (IItop) -- (Itop)
node[midway, above, inner sep=2mm] {$r=0$};
\draw[decorate,decoration=zigzag] (IIbot) -- (Ibot)
node[midway, below, inner sep=2mm] {$r=0$};
\end{tikzpicture}
\end{document}
结果
解释
Tikz 的语法非常强大且灵活。你可以用不同的方式指定绘图的坐标。
- 第一种也是最直接的方法是使用标准笛卡尔坐标,例如
(4,0)
。默认单位是cm
。 - 您还可以指定极坐标,例如
(90:4)
。第一个数字是角度,第二个数字是半径(默认以厘米为单位)。 - 您可以为坐标命名,并使用它的名称,例如
(I)
或(II)
- 构建路径时,您可以将坐标指定为绝对坐标(所有坐标均相对于位于 的原点进行测量
(0,0)
)或相对坐标(所有坐标均相对于某个给定原点进行测量)。对于相对语法,请在坐标前加上+
。要给出原点,请指定第一个坐标,不带+
。
有了上面的内容,您现在可以阅读前几行。每个初始命令在给定的绝对笛卡尔坐标处\node
定义一个命名坐标,名称为(I)
,等等。它们还会在这些坐标处放置一些文本(括号,等之间的文本)。(II)
(4,0)
(-4,0)
{I}
{II}
下一个\path
命令执行了很多操作。它首先将坐标设置(II)
为其余相对坐标的原点。然后,使用相对于的极坐标(II)
,定义一些其他命名坐标,以直角围绕(II)
和距离4
单位。我使用另一种语法将这些坐标命名为(IItop)
等(IIbot)
,该语法将关键字用作coordinate
路径的一部分。同时,我使用选项在这些坐标上排版了一些标签label
。
一旦以这种方式定义了菱形的四个角,就用线将它们连接起来,并在这些线的上方和下方添加一些标签。这是在下一个\draw
命令中完成的。--
两个坐标之间的指定应绘制一条线。在每个段的最终坐标之前,我使用关键字node
在这些线的上方和下方放置文本。
对于右边的菱形,我删除了所有标签,只留下了绘图命令。放置标签的方式应该与第一个菱形几乎相同,这留作练习。
最后,添加波浪线,连接菱形顶部和底部的相应坐标。我再次使用 在node[midway]
这些线条上方(或下方)放置一些文本。
希望这有助于您入门,或者至少激励您阅读手册并尝试 Tikz。
更新
OP 在评论中请求:
Ibot
从您调用的到 顶部III
标记的波浪线中心绘制一条曲线。这可以通过连接和r=0
的线的路径大约 0.75 倍。IIright
Itop
这让我有机会介绍其他有用的 Tikz 功能,包括计算坐标。为了使用此功能,您需要将其添加calc
到参数列表中\usetikzlibrary
。在本例中:
\usetikzlibrary{decorations.pathmorphing,calc}
借助此库,您可以在任何需要坐标的地方使用数学表达式(括在内$
),其中涉及加法或其他坐标运算。它还定义了一种称为“插值”的特殊运算,其语法如下: ($(A)!x!(B)$)
,其中A
和B
是坐标(笛卡尔坐标、极坐标、命名坐标……),x
是 0 到 1 之间的数字。结果坐标是位于直线 AB 上的一个点,与成比例x
(0 表示 A,1 表示 B)。事实上,x 可以是负数或大于 1,允许外推。
使用此功能,“顶部波浪线中间”的点将是:($(IItop)!.5!(Itop)$)
,因此下一个命令将绘制一条连接两个所需点的直线:
\draw[->] % The -> adds an arrow tip
(Ibot) -- ($(IItop)!.5!(Itop)$);
但是原作者要求的是曲线,而不是直线。要得到曲线,最简单的方法(tikz 也有几种方法)是用 运算符替换--
。to
这个没有选项的运算符画的是直线,和 一样--
,但是你可以给它选项弯曲線。
例如,您可以指定线从 出发的角度Ibot
,以及它在终点进入的角度。这样就产生了一条曲线。但是,这些参数本身并不定义一条曲线,而是一组曲线。您可以使用参数 微调获得的曲线looseness
,默认情况下该参数为 1。增加此参数会使曲线“更弯曲”,而减少此参数会使曲线更接近原始直线。
通过反复试验,我发现了以下值:
\draw[->]
(Ibot) to[out=70, in=-15, looseness=1.5] ($(IItop)!.5!(Itop)$);
结果是:
答案2
一种可能性是(杰利迪亚兹在他的评论中提到)是使用坐标来指定点,然后绘制连接相应坐标的线;装饰库可用于绘制之字形线。起点(玩我的代码并阅读 TikZ 文档,您可以添加缺少的元素并自定义结果):
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning,decorations.pathmorphing}
\begin{document}
\begin{tikzpicture}[node distance=2cm]
% coordinates for the nodes
\coordinate (A) at (0,0);
\coordinate[above right = of A,label=$i^{\ast}$] (B);
\coordinate[right = 3cm of B,label=$i^{\ast}$] (C);
\coordinate[below right = of C] (D);
\coordinate[below right = of A] (E);
\coordinate[right = 3cm of E] (F);
% some straight lines uning the coordinates and adding labels
\draw (A) -- node[above] {$f^{\ast}$} (B) -- node[below,sloped,pos=0.25] {$\bar{v}=0$} node[below,sloped,pos=0.75] {$H^{-}$}
(F) -- (D);
\draw (A) -- (E) -- (C) -- (D);
% some decorated lines uning the coordinates and adding labels
\draw[decorate,decoration=zigzag] (B) -- node[above] {$r=0$} (C);
\draw[decorate,decoration=zigzag] (E) -- node[below] {$r=0$} (F);
\end{tikzpicture}
\end{document}
答案3
您有不同的可能性。您可以使用 tikz 的一些基本命令尝试一下。我更新了第一个代码。最终结果并不完整,但自己完成它是一个很好的练习。
解释
JLDIAZ 的回答中有很多很好的解释。我尝试添加一些解释来理解代码之间的区别。
在绘制某些内容之前,我想知道是否需要调整图片的大小。如果我需要缩放图片,scale
我更愿意避免这样做。positioning library
\draw
是 的简写\path[draw]
。可以定义path
来绘制此路径,并定义 来同时绘制一些坐标和节点。
使用下一个代码,我可以使用,但使用定义一些变量(如这里 4 表示 4 厘米)[scale=2]
也很有趣。\myunit
\pgfmathsetmacro command
那么就不可能用一条路径绘制这种图形。第一条路径以 开始
\draw (0,0)
,以 结束cycle;
。
当您添加新的坐标(相对或绝对)时,您可以添加到路径中nodes
。如您所见,代码非常简单,但您需要知道为什么有时需要使用coordinate
或有时node
。coordinate
是一个具有一些不同参数的特殊节点。
--++(45:\myunit)
在获得原点与极坐标之间的一条线后(45:\myunit)
,现在我可以在两点之间添加一些节点。
- 我
coordinate (a)
指出了最后一点 - 我在
node [above]{$i^+$}
最后一个点上方放置了一个基本节点 - 我
node[pos=.5, above left] {$\cal{J}^+$}
将一个节点放置在由最后的点定义的线的中间上方。
最后一个有趣的可能性是在最后一条路径中使用
- `\draw ... 节点[上方=6pt] {$r=0$} 节点[下方=1 cm] {III}``
可以将节点放置在您想要的位置,例如[below=1 cm]
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations.pathmorphing}
\begin{document}
\begin{tikzpicture}%[scale=2]
\pgfmathsetmacro\myunit{4}
\draw (0,0) node [left] {$i^0$}
--++(45:\myunit) coordinate (a)
node[pos=.5, above left] {$\cal{J}^+$}
node[pos=.5, below, sloped] {$\bar{u}=\infty$}
node [above]{$i^+$}
--++(-45:2*\myunit) node[pos=.25, below, sloped] {$\bar{u}=0$}
coordinate (d)
node [below]{$i^-$}
--++(45:\myunit) node [right]{$i^0$}
--++(135:\myunit) coordinate (b)
node [above]{$i^+$}
--++(-135:2*\myunit) coordinate (c)
node [below]{$i^-$}
--cycle;
\draw [decorate, decoration=zigzag] (a) -- node[above=6pt] {$r=0$}
node[below=1 cm] {III}
(b)
(c) -- (d);
\end{tikzpicture}
\end{document}