我怎样才能绘制 CS 字符串图?

我怎样才能绘制 CS 字符串图?

是否存在一个特定的包来渲染字符串图(CS 的字符串,而不是物理的字符串),如下图所示?

弦图

或者,您将如何创建这样的图形?您能提供一个(非常)简单的例子吗?

答案1

这里有一个方法可以实现Tikz

基本思想:

  • 画一些线
  • \node为下面的标签添加一些s
  • \draw上面有一些装饰过的小路
  • 记住相关coordinate内容以支持这些行动
  • 定义/.styles 可以简化代码,并且只需在一个地方更改参数
  • 尝试一种平衡的方法,对于新手来说这并不难理解,并且使用一些路径特性来获得更好的代码

结果

行:

让我们消化一下第一个。

    \draw[bar] (0,0) coordinate (A) -- (1.5,0)  coordinate (B) node[a]{$a$};

考虑画一条简单的线,首先在绝对坐标中:

    \draw (0,0) -- (1.5,0);

因为Tikz是关于以分号结尾的路径;,我们可以添加一个节点,同时\在路径结束前删除。因此,这个在到达 (1.5,0) 后放置一个带有文本 (标签) 的节点;它接受具有某种样式的文本a,即在数学模式下$a$

    \draw (0,0) -- (1.5,0) node[a]{$a$};

把线条的样式信息放在前面,并留给开头的样式部分来详细指定在这里绘制什么:

    \draw[bar] (0,0) -- (1.5,0) node[a]{$a$};

最后将\coordinate语句添加到路径中,以记住某些位置,并删除,\因为它仍然在要绘制的相同路径中。就是这样:

    \draw[bar] (0,0) coordinate (A) -- (1.5,0)  coordinate (B) node[a]{$a$};

其他路径也类似,使用相对移动--++(1.5,0)、绝对坐标的混合,并利用这些节点的最小宽度(此处定义为 5mm)的知识。当然,这可以更系统地完成。

标签如下:

    % ~~~ labels below ~~~~~~~~~~
    \node[mth] at                (A) {$1$};
    \node[mth] at ([xshift=-2.5mm]C) {$f(i) + 1$};

这很简单。第一行使用 style将文本$1$放在记住的位置,这会将文本在 y 方向上向下移动一点。(A)mth

第二个非常相似,除了像我一样放置节点会引入一些复杂性$a$。因此,纠正位置的一种方法是使用(C)并将其向后移动一点(最小宽度的一半):

([xshift=-2.5mm]C)

过度支撑:

    % ~~~ labels above ~~~~
    \draw[decorate,blue] ([ys]A) -- ([ys]B) node[alf]{$\alpha$};
    \draw[decorate,blue] ([ys]D) -- ([ys]E) node[alf]{$\alpha$};

它结合了上述概念,同时使用decorate由 tikz-library 提供的decorations.pathreplacing

  • 它绘制了一条从(A)上方到(B)上方的路径
  • 用括号代替
  • 穿蓝色衣服
  • 将节点放在 $\alpha$ 中间稍上方。

样式块:

 \begin{tikzpicture}[
    a/.style={anchor=west,minimum width=5mm},   % for the node containing "a"
    bar/.style={{Bar[]}-{Bar[]}},               % start- and end-tipps as Bars
    bar2/.style={-{Bar[]}},                     % only end-tipp as bar
    mth/.style={yshift=-5mm},                   % for placing the math-labels
    decoration=brace,                           % the overbrace
    alf/.style={midway,yshift=3mm},             % placing \alpha there
    ys/.style={yshift=5mm},                     % shortcut for these yshifts
 ]

至少对我来说,这一部分是随着我的进步而发展的,例如:

  • 回想一下上面描述的线条部分
  • 直接为draw和放置有用的样式选项node
  • 它们是否太长?或者我至少需要两次?
  • 然后将它们移到这里,并进行一些有用的命名
  • 这样以后我就可以轻松地在这里调整所有这些标签移位等

代码:

\documentclass[10pt,border=3mm,tikz]{standalone}
\usetikzlibrary{arrows.meta}
\usetikzlibrary{decorations.pathreplacing}

\begin{document}
 \begin{tikzpicture}[
    a/.style={anchor=west,minimum width=5mm},   % for the node containing "a"
    bar/.style={{Bar[]}-{Bar[]}},               % start- and end-tipps as Bars
    bar2/.style={-{Bar[]}},                     % only end-tipp as bar
    mth/.style={yshift=-5mm},                   % for placing the math-labels
    decoration=brace,                           % the overbrace
    alf/.style={midway,yshift=3mm},             % placing \alpha there
    ys/.style={yshift=5mm},                     % shortcut for these yshifts
 ]
    % ~~~ lines ~~~~~~~~~~~~
    \draw[bar] (0,0) coordinate (A) -- (1.5,0)  coordinate (B) node[a]{$a$};
    \draw[bar] (2,0) coordinate (C) -- (3.5,0)  coordinate (D);
    \draw[bar2](3.5,0)              --++(1.5,0) coordinate (E) node[a]{$a$};
    \draw[bar] (5.5,0)              --++(1.5,0)                node[a]{$P$};
    
    % ~~~ labels below ~~~~~~~~~~
    \node[mth] at                (A) {$1$};
    \node[mth] at ([xshift=-2.5mm]C) {$f(i) + 1$};
    \node[mth] at                (D) {$i - f(i) + 1$};
    \node[mth] at ([xshift=+2.5mm]E) {$i + 1$};
    
    % ~~~ labels above ~~~~
    \draw[decorate,blue] ([ys]A) -- ([ys]B) node[alf]{$\alpha$};
    \draw[decorate,blue] ([ys]D) -- ([ys]E) node[alf]{$\alpha$};
    
 \end{tikzpicture}
\end{document}

相关内容