如何繪製 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$};

它結合了上面的概念,同時使用decoratetikz-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
 ]

至少對我來說,這部分是隨著我的發展而發展的,例如這樣:

  • 回想一下上面描述的線條部分
  • 直接為drawand添加有用的樣式選項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}

相關內容