用于生成简单图表的简单直观的工具

用于生成简单图表的简单直观的工具

我正在寻找一个简单直观的工具来生成要包含在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

我的首选是pgfplotstikz。它可以让您直接在 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)

输出

图1

代码

\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}

在此处输入图片描述

相关内容