我正在寻找一个简单直观的工具来生成要包含在tex
文档中的简单图表。我想要转换成的图表tex
如下所示:
理想情况下,我希望最终得到tex
代码,但不幸的是我时间紧迫,需要一个真正进入门槛低。因此,如果有任何其他图形工具可以帮助生成类似的东西,我就会感到满意(最好是水平调节助手或类似的东西(Paint
不会起作用;)))。
答案1
这是使用递归的渐近线解决方案。只需更改代码的前五行即可修改输出。确保初始值的数量是 2 的幂,否则可能会引发错误。
unitsize(1inch);
real xspacing = 0.5;
real yspacing = 0.5;
pair[] values = { (1,1), (7,9), (2,8), (8,6) };
string[] labels = { "$y_i$", "$d_2$", "$c_2$", "$d_1$", "$c_1$", "$d_0$", "$c_0$"};
// -------------------------------
real xstart = 0.0;
void drawTree(pair[] values, string[] labels, int level = 0)
{
for (int i = 0; i < values.length; ++i)
{
pair loc1 = (xstart + 2 * i * xspacing, -yspacing * level);
pair loc2 = (xstart + (2 * i + 1) * xspacing, loc1.y);
if (level == 0)
{
label(string(values[i].x), loc1);
label(string(values[i].y), loc2);
}
pair loc3 = (loc1 + loc2) / 2.0 - (0, yspacing);
label(string(values[i].y - values[i].x), loc3);
pair loc4 = loc3 - (0, yspacing);
label(string(values[i].y + values[i].x), loc4);
draw(subpath(loc1--loc3, 0.15, 0.85), 0.3+dashed, Arrow);
draw(subpath(loc2--loc3, 0.15, 0.85), 0.3+dashed, Arrow);
draw(subpath(loc1--loc4, 0.07, 0.93), 0.3+black, Arrow);
draw(subpath(loc2--loc4, 0.07, 0.93), 0.3+black, Arrow);
}
if (level == 0)
{
real x = 2 * values.length * xspacing;
for (int i = 0; i < labels.length; ++i)
{
label(labels[i], (x, -i * yspacing));
}
}
if (values.length < 2) { return; }
pair[] newvalues;
for (int i = 0; i < values.length; i += 2)
{
newvalues.push((values[i].x + values[i].y, values[i+1].x + values[i+1].y));
}
xstart += xspacing / 2.0;
xspacing *= 2.0;
drawTree(newvalues, labels, level + 2);
}
drawTree(values, labels);
答案2
我的首选是pgfplots
和tikz
。它可以让您直接在 Latex 中绘图。
您可以尝试这样的操作:
\documentclass[a4paper]{article}
\usepackage{pgfplots}
\usepackage{tikz}
\tikzset{>=stealth} % arrowheads
\begin{document}
\begin{tikzpicture}
\draw [->] (12,4)node[above]{24} -- (8,0)node[below]{42};
\draw [->] (4,4)node[above]{18} -- (8,0);
\node at (17,0)[right]{$ c_0 $};
\draw [->,dashed] (12,4) -- (8,2);
\draw [->,dashed] (4,4) -- (8,2);
\node at (17,2) [right]{$ d_0 $};
\node at(17,4) [right]{$ c_1 $};
\end{tikzpicture}
\end{document}
我刚刚开始处理您发布的图像。结果将如下所示:
希望这能让你走上正轨。
答案3
我也建议使用 Tikz,但更具体地说是 Tikz 树。也许你可以自动化这个,但我想不出办法,所以解决方案是手动的。我本来打算为你提供一个小样本来完成,但我自己已经完成了,所以就在这里。
基本上,水平距离是,2cm
但中间子节点向下移动,1cm
因此它位于中间,并且侧面的节点具有水平距离,1cm
因此它们正确对齐。
空箭头提示借助arrows.meta
库完成。您可以在本章中查看更多提示“16.5 参考:箭头提示”,第 203 页,Tikz 手册(v 3.0.0)。
输出
代码
\documentclass[margin=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,positioning}
\tikzset{
kit/.style={dashed,<-,>={Kite[open]}},
}
\begin{document}
\begin{tikzpicture}[%
level distance=2cm,
level 1/.style={sibling distance=3cm},
level 2/.style={sibling distance=1.5cm},
level 3/.style={sibling distance=8mm},
rightn/.style={level distance=1cm},
<-,>={Latex},
no edge/.style={
edge from parent/.style={draw=none}}]
\node (root) {42} [grow=up]
child{node (24) {24}
child{node (14r) {14}
child{node (6b) {6}}
child[no edge]{node[yshift=-1cm] (2m) {-2}}
child{node (8r) {8}}
}
child[no edge]{node[yshift=-1cm] (4) {4}}
child{node (10) {10}
child{node (8l) {8}}
child[no edge]{node[yshift=-1cm] (6c) {6}}
child{node (21) {2}}
}}
child[no edge]{node[yshift=-1cm] (6) {6}}
child{node (18) {18}
child{node (16) {16}
child{node (9) {9}}
child[no edge]{node[yshift=-1cm] (2b) {2}}
child{node (7) {7}}
}
child[no edge]{node[yshift=-1cm] (14l) {14}}
child{node (2) {2}
child{node (1r) {1}}
child[no edge]{node[yshift=-1cm] (0) {0}}
child{node (1l) {1}}
}
};
\node[right=6cm of root,level distance=1cm] {$c_0$} [grow=up]
child[no edge,rightn]{node {$d_0$}
child[no edge,rightn]{node {$c_1$}
child[no edge,rightn]{node {$d_1$}
child[no edge,rightn]{node {$c_2$}
child[no edge,rightn]{node {$d_2$}
child[no edge,rightn]{node {$y_i$}}
}}}}};
\draw[kit] (6) edge (18) edge (24);
\draw[kit] (14l) edge (16) edge (2);
\draw[kit] (4) edge (14r) edge (10);
\draw (0) edge (1r) edge (1l);
\draw (2b) edge (7) edge (9);
\draw (6c) edge (21) edge (8l);
\draw (2m) edge (8r) edge (6b);
\end{tikzpicture}
\end{document}
答案4
从 Ben 的tikzpicture
模块开始,并将其转变为宏
\blivet[supress top #]{top-left #}{top-right #}{width}
让我可以开始做这件事。还有更多的自动化工作要做。blivets 的高度用 来定义\def\blivetheight{3}
。
\documentclass[a4paper]{article}
\usepackage{pgfplots,stackengine}
\setstackEOL{\\}\setstackgap{S}{-5pt}
\usepackage{tikz}
\tikzset{>=stealth} % arrowheads
\def\blivetheight{3}
\newcommand\blivet[4][\relax]{%
\ifx\relax#1%
\def\topleft{#2}\def\topright{#3}%
\else
\def\topleft{}\def\topright{}%
\fi
\makebox[#4cm]{\begin{tikzpicture}
\draw [->] (#4,\blivetheight)node[above]{\topright} --
(#4/2,0)node[below]{\the\numexpr#2+#3\relax};
\draw [->] (0,\blivetheight)node[above]{\topleft} -- (#4/2,0);
\draw [->,dashed] (#4,\blivetheight) -- (#4/2,\blivetheight/2)%
node[below]{\the\numexpr#3-#2\relax};
\draw [->,dashed] (0,\blivetheight) -- (#4/2,\blivetheight/2);
\end{tikzpicture}
}}
\newcommand\gap[1]{\unskip\hspace{#1cm}\ignorespaces}
\begin{document}
\Shortstack{
\blivet{1}{1}{1.5}\gap{1.5}\blivet{7}{9}{1.5}\gap{1.5}
\blivet{2}{8}{1.5}\gap{1.5}\blivet{8}{6}{1.5}\\
\blivet[x]{2}{16}{3}\gap{3}\blivet[x]{10}{14}{3}\\
\blivet[x]{18}{24}{6}
}\qquad
{\setstackgap{S}{1.5cm}\setstackEOL{ }\raisebox{4pt}{%
\ensurestackMath{\Shortstack{y_i d_2 c_2 d_1 c_1 d_0 c_0}}}}
\end{document}