使用 pgfplots 通过点平滑曲线

使用 pgfplots 通过点平滑曲线

我知道人们可以通过选择将前一个点和下一个点考虑进来来smooth获得平滑的点连接,但这仍然\addplot连接所有的要点。

我怎样才能通过点绘制一条平滑的pgfplots曲线不必要连接?我不确定这是否正确,但我认为我在寻找“贝塞尔曲线”(如果错误请纠正我)。要清楚的是:我确实不是想要像可以用的那样进行曲线拟合gnuplot,只是一些“草率平滑”的点连接。

示例图片(不是来自我的数据!):

在此处输入图片描述

这是我的真实数据,它们不遵循已知的、分析的数学函数:

43  3.22
44  3.26
45  3.28
46  3.40
47  3.60
48  3.53
49  3.50
50  3.60
51  3.59
52  3.54
53  3.55
54  3.51
55  3.35
56  3.45
57  3.42
58  3.43
59  3.42
60  3.42
61  3.43
62  3.47
63  3.45
64  3.40
65  3.20
66  3.21
67  3.17
68  3.20
69  3.22
70  3.36
71  3.37
72  3.37
73  3.30
74  3.33
75  3.39
76  3.41
77  3.34
78  3.45
79  3.42
80  3.38
81  3.33
82  3.15
83  3.35
84  3.33
85  3.20
86  3.24
87  3.20

答案1

使用gnuplot后端,将您的点放入file.dat,然后使用编译两次-shell-escape

在此处输入图片描述

\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\begin{document}
\begin{tikzpicture}
  \begin{axis}
    \addplot +[no markers, raw gnuplot] gnuplot {
        plot 'file.dat' smooth sbezier;
    };
    \addplot +[only marks, raw gnuplot] gnuplot {
        plot 'file.dat' with points;
    };
  \end{axis}
\end{tikzpicture}
\end{document}

答案2

您可以做的一件事是计算数据的 LOESS 平滑度。我不知道如何在 LaTeX 中直接执行此操作,但您可以在 R 中预处理数据(无论如何,它是免费的,而且很有用)。

以下代码从名为 的文件中读取数据data.dat,并使用的跨度对其进行平滑0.3(即,将每个点周围 30% 的数据考虑在内以计算多项式),然后将其写入名为 的文件中smooth.dat

datapoints = read.delim('data.dat', header=F)
smooth=loess(datapoints$V2 ~ datapoints$V1, span=0.3)
write.table(data.frame(smooth$x,smooth$fitted), 'smooth.dat',sep='\t', quote=F, col.names=F, row.names=F)

然后您可以使用以下方法进行绘图:

\documentclass[border=5mm]{standalone}
\usepackage{pgfplots}

\begin{document}

\begin{tikzpicture}
\begin{axis}
\addplot [only marks] table {../data.dat};
\addplot [red, smooth] table {../smooth.dat};
\end{axis}

\end{tikzpicture}
\end{document}

答案3

这是带有贝塞尔曲线的数据:

\documentclass{article}% run with xelatex
%\usepackage[pdf]{pstricks}% for pdflatex --shell-escape
\usepackage{pst-plot}
\begin{document}
\psset{xunit=0.2,yunit=5}
\begin{pspicture}(0,0)(50,1)
\pstScalePoints(1,1){40 sub}{3 sub}
\psaxes[ticksize=0 5pt,Dy=0.2,Dx=10,Ox=40,Oy=3]{->}(0,0)(50,1)
\readdata\data{data0.dat}
\listplot[linecolor=red,linewidth=1.5pt,plotstyle=bezier]{43 3.22 \data}
\listplot[plotstyle=dots]{43 3.22 \data}
\end{pspicture}

\end{document}

在此处输入图片描述

相关内容