这个想法是制作一个这样的情节
来源:http://figshare.com/articles/_Waddington_s_8220_Epigenetic_Landscape_8221_/620879
但前面只有 2 个井,而不是 4 个。而且颜色也不重要。
这是我目前所拥有的:
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat = newest}
\begin{document}
\pgfplotsset{width=\textwidth}
\begin{tikzpicture}
\begin{axis}[domain=-6:40,domain y=0:12,view={-80}{40},colormap/blackwhite, width=\textwidth]
\addplot3[surf,shader=faceted interp]({x},{y},{exp(-0.07*x)*cos(deg(y)) + (exp((0.15*x)-6.5) * (1+cos(deg(y)/2)))});
\fill[ball color=orange] (axis cs:30,6,0.5) circle [radius=0.2cm];
%
\end{axis}
\end{tikzpicture}
\end{document}
这使
如你所见。我已经很接近了。非常感谢@percusse 最初的帮助!
然而,一些小事情仍然存在,例如
- 侧面可以更圆一些,就像示意图中那样
- “大”山不应该是凹的,而应该是凸的,例如“肿胀的”
- 后部曲线可以更陡一些
代码中的想法是在前面定义一个参数曲线exp(-0.07*x)*cos(deg(y))
,在后面定义一个权重更大的第二条参数曲线(exp((0.15*x)-6.5) * (1+cos(deg(y)/2)))
任何关于如何完成最后 20% 的指点都将不胜感激:)
编辑 2014 年 11 月 6 日
以下是使用下面的@TonioElGringo 评论的更新。
由。。。生产
\begin{tikzpicture}
\begin{axis}[domain=0:1,domain y=0:1,view={-10}{50},colormap/jet, width=\textwidth]
\addplot3[surf,shader=faceted interp]({x},{y},{1-((1-y)*(exp(-80*(x-1/3)^2)+exp(-80*(x-2/3)^2))/2 + y*exp(-60*(x-1/2)^2)/5)});
\end{axis}
\end{tikzpicture}
小编辑
我只是附加了一个包含 50 个样本的版本,以显示它在更“平滑”时的样子。
我刚刚添加了, samples=50
addplot 选项。小心,这可能需要您调整 tex 的内存设置,因为需要进行许多计算。
答案1
您需要的是不同类型的函数,如下所示:
f(x,y) = 1 - [(1-y)*(exp(-a1*(x-1/3)^2)+exp(-a1*(x-2/3)^2)) * l1
+ y *(exp(-a2*(x-1/2)^2)) * l2]
此函数只是一对高斯函数y=0
与另一个高斯函数之间的线性插值y=1
之间的线性插值。参数a1,a2,l1和l2允许您改变高斯的大小。
使用以下代码
\begin{tikzpicture}
\begin{axis}[domain=0:1,domain y=0:1,view={-10}{50},colormap/jet, width=\textwidth]
\addplot3[surf,shader=faceted interp, samples=50]({x},{y},{1-((1-y)*(exp(-80*(x-1/3)^2)+exp(-80*(x-2/3)^2))/2 + y*exp(-60*(x-1/2)^2)/5)});
\end{axis}
\end{tikzpicture}
我们得到