使用 pgfplots 绘制有向图

使用 pgfplots 绘制有向图

我有几个以下格式的文件:

x   y
12  12
12  13
13  15
15  15
15  13
13  12
12  10
10  8
8   8
8   10
10  12
12  12
12  10
10  10

我想使用 pgfplots 将它们绘制为 .tex 文件中的有向图。

我目前正在使用的代码是这个

\usepackage{pgfplots}

\begin{center}
\begin{tikzpicture}
\begin{axis}[title=File1,
             xlabel={},
             ylabel={}]
\addplot table {data-1.txt};
\end{axis}
\end{tikzpicture}
\end{center}

这绘制了点与点之间的线,但这还不足以满足我的需要。我想

  1. 为第一个点设置不同的颜色
  2. 点之间有箭头指示点所走的“路径”。

某些文件(如示例中的文件)可能存在重叠节点。如果您的解决方案可以处理这种情况,那将为我节省很多精力。

我想做的另一件事是对生成的 D-Graph 中的点进行线性插值。但是我完全不知道该怎么做。我知道这看起来相当尴尬,甚至可能用最常见的线性插值算法都无法实现,但如果你能帮我一下,我将不胜感激。

作为上面描述的过程的一个例子,我希望得到与此类似的结果:

没有任何

答案1

使用 PSTricks 的解决方案。它需要http://texnik.dante.de/tex/generic/pst-node/pst-node.tex 运行以下命令xelatex

\documentclass[a4paper]{article}
\usepackage{filecontents}
\begin{filecontents*}{node.data}
12  12
12  13
13  15
15  15
15  13
13  12
12  10
10  8
8   8
8   10
\end{filecontents*}

\usepackage{pst-node,pst-plot}

\begin{document}
\begin{pspicture}(6.5,6.5)(16,16)
  \psaxes[axesstyle=frame,ticksize=0 9cm,tickcolor=black!20,Ox=7,Oy=7](7,7)(16,16)
  \saveDataAsNodes{node.data}{N}
  \psset{radius=2.5mm,arrows=->,arrowscale=1.5,nodesep=2.7mm,linewidth=1.3pt}
  \Cnodeput[linecolor=red]{0}(N0){foo}{0}
  \multido{\iA=1+1,\iB=0+1}{\numexpr\the\psLoopIndex-1}{%
    \Cnodeput{0}(N\iA){foo}{\iA}\ncline{N\iB}{N\iA}}
  \readdata\data{node.data}
  \listplot[plotstyle=LSM,linestyle=dashed,linecolor=blue,xStart=7,xEnd=16]{\data}
\end{pspicture}

\end{document}

在此处输入图片描述

线性回归线方程可以用以下公式绘制\PstDebug=1

在此处输入图片描述

节点被命名为N0...。N9节点之间可以有任意偏移量的任意连接。

针对多个节点被覆盖的解决方案,仅打印最后一个节点:

\documentclass[a4paper]{article}
\usepackage{filecontents}
\begin{filecontents*}{node2.data}
12  12
12  13
13  15
15  15
15  13
13  12
12  10
10  8
8   8
8   10
10  12
12  12
12  10
10  10
\end{filecontents*}
\usepackage{pst-node,pst-plot}
\def\CPut(#1)#2{\pscircle*[linecolor=white](#1){3mm}\rput(#1){#2}\pscircle(#1){3mm}}

\begin{document}
\begin{pspicture}(6.5,6.5)(16,16)
  \psaxes[axesstyle=frame,ticksize=0 9cm,tickcolor=black!20,Ox=7,Oy=7](7,7)(16,16)
  \saveDataAsNodes{node2.data}{N}
  \psset{radius=2.5mm,arrows=->,arrowscale=1.5,nodesep=3mm,linewidth=1.3pt}
  \multido{\iA=\the\psLoopIndex+-1,\iB=\numexpr\the\psLoopIndex-1\relax+-1}%
     {\the\psLoopIndex}{\CPut(N\iA){\iA}\ncline{N\iB}{N\iA}}
  \pscircle*[linecolor=red](N0){3mm}\rput(N0){\bf\white0}
  \readdata\data{node2.data}
  \pslistplot[linecolor=blue,linestyle=dashed,plotstyle=LSM,xStart=7,xEnd=16]{\data}
\end{pspicture}
\end{document}

在此处输入图片描述

如果您需要有关连接本身的一些信息,请使用(\ncput):

  \multido{\iA=\the\psLoopIndex+-1,\iB=\numexpr\the\psLoopIndex-1\relax+-1}%
     {\the\psLoopIndex}{\CPut(N\iA){\iA}\ncline{N\iB}{N\iA}\ncput*[npos=0.4]{\tiny\iB/\iA}}

在此处输入图片描述

答案2

以下是使用以下代码的方法pgfplots 中线和点之间的间隙,类似于 gnuplot 中的 pointintervalbox在坐标之间画箭头。

\documentclass[border=5mm]{standalone}

\usepackage{pgfplots, pgfplotstable}
\makeatletter
\pgfplotsset{
    discontinuous line/.code={
        \pgfkeysalso{mesh, shorten <=#1, shorten >=#1}
        \def\pgfplotsplothandlermesh@VISUALIZE@std@fill@andor@stroke{%
            \pgfplotspatchclass{\pgfplotsplothandlermesh@patchclass}{fill path}%
            \pgfplotsplothandlermesh@definecolor
            \pgfusepath{stroke}
            \pgfplotsplothandlermesh@show@normals@if@configured
        }%
    },
    discontinuous line/.default=1.5mm
}
\makeatother

\begin{document}

\pgfplotstableread{
x   y
12  12
12  13
13  15
15  15
15  13
13  12
12  10
10  8
8   8
8   10
}\datatable

\begin{tikzpicture}
\begin{axis}[
    title=File1,
    width=10cm
]
\addplot [
    discontinuous line=2.5mm,
    very thick, black, -latex,
    nodes near coords=\coordindex,
    every  node near coord/.style={
        draw,
        circle,
        anchor=center,
        inner sep=1.5pt,
        color={\ifnum\coordindex=0 red\else black\fi}
    }] table {\datatable};

\addplot [ultra thick, blue] table [y={create col/linear regression={y=y}}] {\datatable};
\end{axis}
\end{tikzpicture}

\end{document}

相关内容