我知道人们可以通过选择将前一个点和下一个点考虑进来来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}