我想用 pgf-plots 和 gnuplot 创建平滑曲面图。以下代码生成一个图形,但我需要沿 y 方向的更多网格点。我该如何实现?
增加样本在这里不起作用。结果变得更糟...
提前致谢
\documentclass{scrartcl}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\begin{document}
\begin{figure}
\centering
\begin{tikzpicture}
\begin{axis}[
width=0.9\textwidth,
3d box,
view={20}{25},
plot box ratio=3 10 5,
ylabel={y},
xlabel={x},
]
\addplot3[raw gnuplot,
surf,
%empty line = jump,
samples=100,
]
gnuplot[surf,
mesh/check=false,
]{
n=1e-5;
b=100;
h=10;
p=-0.0001;
K=((16*b**2)/(n*pi**3))*(-p);
Sum(i,x,y)=K*(((-1)**(0.5*((2*i-1)-1)))*(1-((cosh(((2*i-1)*pi*x)/(2*b)))/(cosh(((2*i-1)*pi*h)/(2*b)))))*((cos(((2*i-1)*pi*y)/(2*b)))/((2*i-1)**3)));
u(i,x,y)=(i==0)?0:(u(i-1,x,y)+Sum(i,x,y));
splot [-h:h] [-b:b] u(25,x,y)/u(25,0,0);
};
\end{axis}
\end{tikzpicture}
\end{figure}
\end{document}
答案1
该问题是由于 pgfplots 没有在一个地方正确尊重“原始 gnuplot”选项而引起的:它使用自己的键samples
和samples y
确定输入矩阵大小,但没有将它们传达给 gnuplot。
pgfplots 的开发者版本现在修复了此行为的一个错误。在此版本稳定之前,我可以为您提供一个(非常简单的)解决方法(见下文)。
但是,您仍然需要将样本计数传达给 gnuplot(在这种情况下raw gnuplot
,pgfplots 假定您承担全部责任)。
这两件事都可以用以下方法实现
\addplot3[raw gnuplot,
surf,
%empty line = jump,
samples=25, %---
samples y=50, %---
]
gnuplot[surf,
%mesh/check=false,
]{
n=1e-5;
b=100;
h=10;
p=-0.0001;
set samples 25,50; %---
set isosamples 25,50; %---
K=((16*b**2)/(n*pi**3))*(-p);
Sum(i,x,y)=K*(((-1)**(0.5*((2*i-1)-1)))*(1-((cosh(((2*i-1)*pi*x)/(2*b)))/(cosh(((2*i-1)*pi*h)/(2*b)))))*((cos(((2*i-1)*pi*y)/(2*b)))/((2*i-1)**3)));
u(i,x,y)=(i==0)?0:(u(i-1,x,y)+Sum(i,x,y));
splot [-h:h] [-b:b] u(25,x,y)/u(25,0,0);
};
(pgfplots) 键samples=<x>
必须与 的第一个参数匹配set isosamples=<x>, <y>
,并且 (pgfplots) 键samples y=<y>
必须与 的第二个参数匹配。老实说,我不知道如何组合 gnuplot 选项set samples
和set isosamples
- 我想set samples
这里没有必要。这应该(通常)可以解决这个错误。
我强烈建议取消注释mesh/check=false
(这表明 pgfplots 无法读取矩阵结构)。