我有几个以下格式的文件:
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}
这绘制了点与点之间的线,但这还不足以满足我的需要。我想
- 为第一个点设置不同的颜色
- 点之间有箭头指示点所走的“路径”。
某些文件(如示例中的文件)可能存在重叠节点。如果您的解决方案可以处理这种情况,那将为我节省很多精力。
我想做的另一件事是对生成的 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}