更改桑基图中箭头尖的大小

更改桑基图中箭头尖的大小

我正在使用sankey包来创建桑基图。当使用arrowSankey 节点的起始和结束样式时,箭头尖端默认延伸10pt

看看包装文档(版本 3.0.1;第 5.4 节,第 21 页),这似乎是一个硬编码值。因此我的问题是:如何最好地使其可配置,以便在绘制图表时可以方便地更改箭头尖端的深度(就像它一样)?

这是一个可供参考的小示例文档(感谢 Alan Munn 的建议):

\documentclass{article}
\usepackage{sankey}
\begin{document}
\begin{tikzpicture}
\begin{sankeydiagram}
\sankeyset{start style=arrow, end style=arrow}
\sankeynodestart{at={0, 0}, name=q0, quantity=5}
\sankeynodestart{at={0, -2}, name=q1, quantity=25}
\sankeyadvance{q0}{2cm}
\sankeyend{q0}
\sankeyadvance{q1}{2cm}
\sankeyend{q1}
\end{sankeydiagram}
\end{tikzpicture}
\end{document}

(全面披露:由于该sankey软件包是为了回答 tex.sx 上的问题而启动的,我希望这个问题也能导致进一步的开发和该软件包的新版本,其中的值不再是硬编码的。但与此同时,我很感谢您的回答!)

答案1

arrow样式只是预定义的样式。您可以定义自己的样式。

定义新样式arrow 20

\sankeyset{
  new start style={arrow 20}{
    (\name.left) -- ++(-20pt,0) -- ([xshift=-20pt/6]\name.center)
    -- ([xshift=-20pt]\name.right) -- (\name.right) -- cycle
  }{
    (\name.left) -- ++(-20pt,0) -- ([xshift=-20pt/6]\name.center)
    -- ([xshift=-20pt]\name.right) -- (\name.right)
  },
  new end style={arrow 20}{
    (\name.left) -- ([yshift=1mm]\name.left)
    -- ([xshift=20pt]\name.center) -- ([yshift=-1mm]\name.right)
    -- (\name.right) -- cycle
  }{
    (\name.left) -- ([yshift=1mm]\name.left)
    -- ([xshift=20pt]\name.center) -- ([yshift=-1mm]\name.right)
    -- (\name.right)
  },
}

使用方法:

\documentclass{article}
\usepackage{sankey}

\sankeyset{
  new start style={arrow 20}{
    (\name.left) -- ++(-20pt,0) -- ([xshift=-20pt/6]\name.center)
    -- ([xshift=-20pt]\name.right) -- (\name.right) -- cycle
  }{
    (\name.left) -- ++(-20pt,0) -- ([xshift=-20pt/6]\name.center)
    -- ([xshift=-20pt]\name.right) -- (\name.right)
  },
  new end style={arrow 20}{
    (\name.left) -- ([yshift=1mm]\name.left)
    -- ([xshift=20pt]\name.center) -- ([yshift=-1mm]\name.right)
    -- (\name.right) -- cycle
  }{
    (\name.left) -- ([yshift=1mm]\name.left)
    -- ([xshift=20pt]\name.center) -- ([yshift=-1mm]\name.right)
    -- (\name.right)
  },
}

\begin{document}
\begin{tikzpicture}
\begin{sankeydiagram}
\sankeyset{start style=arrow 20, end style=arrow 20}
\sankeynodestart{at={0, 0}, name=q0, quantity=5}
\sankeynodestart{at={0, -2}, name=q1, quantity=25}
\sankeyadvance{q0}{2cm}
\sankeyend{q0}
\sankeyadvance{q1}{2cm}
\sankeyend{q1}
\end{sankeydiagram}
\end{tikzpicture}
\end{document}

在此处输入图片描述

可变长度

您的新样式可以使用宏作为参数。

\documentclass{standalone}
\usepackage{sankey}

\sankeyset{
  new start style={variable arrow}{
    (\name.left) -- ++(-\arrowvariabledist,0) -- ([xshift=-\arrowvariabledist/6]\name.center)
    -- ([xshift=-\arrowvariabledist]\name.right) -- (\name.right) -- cycle
  }{
    (\name.left) -- ++(-\arrowvariabledist,0) -- ([xshift=-\arrowvariabledist/6]\name.center)
    -- ([xshift=-\arrowvariabledist]\name.right) -- (\name.right)
  },
  new end style={variable arrow}{
    (\name.left) -- ([yshift=1mm]\name.left)
    -- ([xshift=\arrowvariabledist]\name.center) -- ([yshift=-1mm]\name.right)
    -- (\name.right) -- cycle
  }{
    (\name.left) -- ([yshift=1mm]\name.left)
    -- ([xshift=\arrowvariabledist]\name.center) -- ([yshift=-1mm]\name.right)
    -- (\name.right)
  },
}


\begin{document}
\begin{tikzpicture}
  \begin{sankeydiagram}
    \sankeyset{start style=variable arrow, end style=variable arrow}
    
    \def\arrowvariabledist{30pt}
    \sankeynodestart{at={0, 0}, name=q0, quantity=5}
    \sankeyadvance{q0}{2cm}
    \sankeyend{q0}
    
    \def\arrowvariabledist{20pt}
    \sankeynodestart{at={0, -2}, name=q1, quantity=25}
    \sankeyadvance{q1}{2cm}
    \sankeyend{q1}
  \end{sankeydiagram}
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容