TikZ PGF: How to draw crater-like 3D surface based on polynomial equations?












4















Assumed we have some kind of squared 3D graph like this one:



Minimum Working Example (MWE):



documentclass{standalone}
usepackage{tikz, pgfplots}

begin{document}

begin{tikzpicture}
begin{axis}[samples=20]
addplot3[surf, domain=-2:2] {-x^2-y^2};
end{axis}
end{tikzpicture}

end{document}




Screenshot of the result:



Visualization of pipe flow





How can I replace the current graph with some 4th degree polynomial formula in both directions x and y, e.g. -1/3*x^4+x^2 and -1/3*y^4+y^2?





Draft of the desired result



In the end it should look like that:



Draft of the desired result



The draft is more or less a circular volcano with a crater in the middle, I hope you can imagine. :-)



I don't know why, but several approaches with...



addplot3[surf, domain=-2:2] {(-1/3*y^4+y^2)*(-1/3*y^4+y^2)};


... do not show up like I expected.










share|improve this question




















  • 1





    Have you tried replacing two of the y in your formula with x?

    – TeXnician
    Jan 27 at 13:06
















4















Assumed we have some kind of squared 3D graph like this one:



Minimum Working Example (MWE):



documentclass{standalone}
usepackage{tikz, pgfplots}

begin{document}

begin{tikzpicture}
begin{axis}[samples=20]
addplot3[surf, domain=-2:2] {-x^2-y^2};
end{axis}
end{tikzpicture}

end{document}




Screenshot of the result:



Visualization of pipe flow





How can I replace the current graph with some 4th degree polynomial formula in both directions x and y, e.g. -1/3*x^4+x^2 and -1/3*y^4+y^2?





Draft of the desired result



In the end it should look like that:



Draft of the desired result



The draft is more or less a circular volcano with a crater in the middle, I hope you can imagine. :-)



I don't know why, but several approaches with...



addplot3[surf, domain=-2:2] {(-1/3*y^4+y^2)*(-1/3*y^4+y^2)};


... do not show up like I expected.










share|improve this question




















  • 1





    Have you tried replacing two of the y in your formula with x?

    – TeXnician
    Jan 27 at 13:06














4












4








4


2






Assumed we have some kind of squared 3D graph like this one:



Minimum Working Example (MWE):



documentclass{standalone}
usepackage{tikz, pgfplots}

begin{document}

begin{tikzpicture}
begin{axis}[samples=20]
addplot3[surf, domain=-2:2] {-x^2-y^2};
end{axis}
end{tikzpicture}

end{document}




Screenshot of the result:



Visualization of pipe flow





How can I replace the current graph with some 4th degree polynomial formula in both directions x and y, e.g. -1/3*x^4+x^2 and -1/3*y^4+y^2?





Draft of the desired result



In the end it should look like that:



Draft of the desired result



The draft is more or less a circular volcano with a crater in the middle, I hope you can imagine. :-)



I don't know why, but several approaches with...



addplot3[surf, domain=-2:2] {(-1/3*y^4+y^2)*(-1/3*y^4+y^2)};


... do not show up like I expected.










share|improve this question
















Assumed we have some kind of squared 3D graph like this one:



Minimum Working Example (MWE):



documentclass{standalone}
usepackage{tikz, pgfplots}

begin{document}

begin{tikzpicture}
begin{axis}[samples=20]
addplot3[surf, domain=-2:2] {-x^2-y^2};
end{axis}
end{tikzpicture}

end{document}




Screenshot of the result:



Visualization of pipe flow





How can I replace the current graph with some 4th degree polynomial formula in both directions x and y, e.g. -1/3*x^4+x^2 and -1/3*y^4+y^2?





Draft of the desired result



In the end it should look like that:



Draft of the desired result



The draft is more or less a circular volcano with a crater in the middle, I hope you can imagine. :-)



I don't know why, but several approaches with...



addplot3[surf, domain=-2:2] {(-1/3*y^4+y^2)*(-1/3*y^4+y^2)};


... do not show up like I expected.







pgfplots 3d






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Jan 27 at 12:09









Stefan Pinnow

20.2k83377




20.2k83377










asked Jan 27 at 11:27









DaveDave

891618




891618








  • 1





    Have you tried replacing two of the y in your formula with x?

    – TeXnician
    Jan 27 at 13:06














  • 1





    Have you tried replacing two of the y in your formula with x?

    – TeXnician
    Jan 27 at 13:06








1




1





Have you tried replacing two of the y in your formula with x?

– TeXnician
Jan 27 at 13:06





Have you tried replacing two of the y in your formula with x?

– TeXnician
Jan 27 at 13:06










1 Answer
1






active

oldest

votes


















5














Something of this sort? (Up to a sign this is a so-called Mexican hat potential.)



documentclass[tikz,border=3.14mm]{standalone}
usepackage{pgfplots}
pgfplotsset{compat=1.16}

begin{document}

begin{tikzpicture}
begin{axis}[samples=20,zmin=0,zmax=1]
addplot3[surf, domain=0:1,domain y=0:360,z buffer=sort]
({x*cos(y)},{x*sin(y)},{3*(0.5*x^2-x^4)+0.5});
end{axis}
end{tikzpicture}
end{document}


enter image description here



Or, if you do



 addplot3[surf, domain=-1:1] {(x^2+y^2)-0.5*(x^2+y^2)^2};


you'll get



enter image description here



Yes, it is possible to extend the plot to the axes, but it is not as straightforward as one may think (or I am missing something obvious).



documentclass[tikz,border=3.14mm]{standalone}
usepackage{pgfplots}
pgfplotsset{compat=1.16}

begin{document}

begin{tikzpicture}[declare function={f(x,y)=(x^2+y^2)-0.5*(x^2+y^2)^2;}]
begin{axis}[samples=20,zmin=0,zmax=1,xmin=-1,xmax=1,ymin=-1,ymax=1]
% clip (-1,-1,{f(-1,-1)}) -- (1,-1,{f(1,-1)}) -- (1,1,{f(1,1)})
% -- (1,1,1) -- (-1,-1,1); % not needed
addplot3[surf, domain=-2:2,samples=50,point meta={max(f(x,y),0)}] {f(x,y)};
end{axis}
end{tikzpicture}
end{document}


enter image description here



One way to obtain a more shallow local minimum is to increase the plot range.



documentclass[tikz,border=3.14mm]{standalone}
usepackage{pgfplots}
pgfplotsset{compat=1.16}

begin{document}
begin{tikzpicture}[declare function={f(x,y)=(x^2+y^2)-0.5*(x^2+y^2)^2;}]
pgfmathsetmacro{myxmax}{2}
pgfmathsetmacro{myzmin}{f(myxmax,0)}
begin{axis}[samples=20,zmin=myzmin,zmax=1,xmin=-myxmax,xmax=myxmax,ymin=-myxmax,ymax=myxmax]
addplot3[surf, domain=-2:2,samples=50,point meta={max(f(x,y),myzmin)}] {f(x,y)};
end{axis}
end{tikzpicture}
end{document}


enter image description here






share|improve this answer


























  • Thanks a lot for your great help! Your second picture looks beautiful! Would it be possible to let the graph end at the line of each bottom edge? And maybe the the "crater" in the middle not that deep? Half depth would be enough... :-)

    – Dave
    Feb 2 at 16:39






  • 1





    @Dave I added a proposal for that.

    – marmot
    Feb 2 at 16:58






  • 1





    @Dave I added a way to get a more shallow minimum. This way is not unique.

    – marmot
    Feb 2 at 18:20











  • I guess you can probably help me along with a further question as well: tex.stackexchange.com/questions/473081/…

    – Dave
    Feb 2 at 18:42











Your Answer








StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "85"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f472073%2ftikz-pgf-how-to-draw-crater-like-3d-surface-based-on-polynomial-equations%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes









5














Something of this sort? (Up to a sign this is a so-called Mexican hat potential.)



documentclass[tikz,border=3.14mm]{standalone}
usepackage{pgfplots}
pgfplotsset{compat=1.16}

begin{document}

begin{tikzpicture}
begin{axis}[samples=20,zmin=0,zmax=1]
addplot3[surf, domain=0:1,domain y=0:360,z buffer=sort]
({x*cos(y)},{x*sin(y)},{3*(0.5*x^2-x^4)+0.5});
end{axis}
end{tikzpicture}
end{document}


enter image description here



Or, if you do



 addplot3[surf, domain=-1:1] {(x^2+y^2)-0.5*(x^2+y^2)^2};


you'll get



enter image description here



Yes, it is possible to extend the plot to the axes, but it is not as straightforward as one may think (or I am missing something obvious).



documentclass[tikz,border=3.14mm]{standalone}
usepackage{pgfplots}
pgfplotsset{compat=1.16}

begin{document}

begin{tikzpicture}[declare function={f(x,y)=(x^2+y^2)-0.5*(x^2+y^2)^2;}]
begin{axis}[samples=20,zmin=0,zmax=1,xmin=-1,xmax=1,ymin=-1,ymax=1]
% clip (-1,-1,{f(-1,-1)}) -- (1,-1,{f(1,-1)}) -- (1,1,{f(1,1)})
% -- (1,1,1) -- (-1,-1,1); % not needed
addplot3[surf, domain=-2:2,samples=50,point meta={max(f(x,y),0)}] {f(x,y)};
end{axis}
end{tikzpicture}
end{document}


enter image description here



One way to obtain a more shallow local minimum is to increase the plot range.



documentclass[tikz,border=3.14mm]{standalone}
usepackage{pgfplots}
pgfplotsset{compat=1.16}

begin{document}
begin{tikzpicture}[declare function={f(x,y)=(x^2+y^2)-0.5*(x^2+y^2)^2;}]
pgfmathsetmacro{myxmax}{2}
pgfmathsetmacro{myzmin}{f(myxmax,0)}
begin{axis}[samples=20,zmin=myzmin,zmax=1,xmin=-myxmax,xmax=myxmax,ymin=-myxmax,ymax=myxmax]
addplot3[surf, domain=-2:2,samples=50,point meta={max(f(x,y),myzmin)}] {f(x,y)};
end{axis}
end{tikzpicture}
end{document}


enter image description here






share|improve this answer


























  • Thanks a lot for your great help! Your second picture looks beautiful! Would it be possible to let the graph end at the line of each bottom edge? And maybe the the "crater" in the middle not that deep? Half depth would be enough... :-)

    – Dave
    Feb 2 at 16:39






  • 1





    @Dave I added a proposal for that.

    – marmot
    Feb 2 at 16:58






  • 1





    @Dave I added a way to get a more shallow minimum. This way is not unique.

    – marmot
    Feb 2 at 18:20











  • I guess you can probably help me along with a further question as well: tex.stackexchange.com/questions/473081/…

    – Dave
    Feb 2 at 18:42
















5














Something of this sort? (Up to a sign this is a so-called Mexican hat potential.)



documentclass[tikz,border=3.14mm]{standalone}
usepackage{pgfplots}
pgfplotsset{compat=1.16}

begin{document}

begin{tikzpicture}
begin{axis}[samples=20,zmin=0,zmax=1]
addplot3[surf, domain=0:1,domain y=0:360,z buffer=sort]
({x*cos(y)},{x*sin(y)},{3*(0.5*x^2-x^4)+0.5});
end{axis}
end{tikzpicture}
end{document}


enter image description here



Or, if you do



 addplot3[surf, domain=-1:1] {(x^2+y^2)-0.5*(x^2+y^2)^2};


you'll get



enter image description here



Yes, it is possible to extend the plot to the axes, but it is not as straightforward as one may think (or I am missing something obvious).



documentclass[tikz,border=3.14mm]{standalone}
usepackage{pgfplots}
pgfplotsset{compat=1.16}

begin{document}

begin{tikzpicture}[declare function={f(x,y)=(x^2+y^2)-0.5*(x^2+y^2)^2;}]
begin{axis}[samples=20,zmin=0,zmax=1,xmin=-1,xmax=1,ymin=-1,ymax=1]
% clip (-1,-1,{f(-1,-1)}) -- (1,-1,{f(1,-1)}) -- (1,1,{f(1,1)})
% -- (1,1,1) -- (-1,-1,1); % not needed
addplot3[surf, domain=-2:2,samples=50,point meta={max(f(x,y),0)}] {f(x,y)};
end{axis}
end{tikzpicture}
end{document}


enter image description here



One way to obtain a more shallow local minimum is to increase the plot range.



documentclass[tikz,border=3.14mm]{standalone}
usepackage{pgfplots}
pgfplotsset{compat=1.16}

begin{document}
begin{tikzpicture}[declare function={f(x,y)=(x^2+y^2)-0.5*(x^2+y^2)^2;}]
pgfmathsetmacro{myxmax}{2}
pgfmathsetmacro{myzmin}{f(myxmax,0)}
begin{axis}[samples=20,zmin=myzmin,zmax=1,xmin=-myxmax,xmax=myxmax,ymin=-myxmax,ymax=myxmax]
addplot3[surf, domain=-2:2,samples=50,point meta={max(f(x,y),myzmin)}] {f(x,y)};
end{axis}
end{tikzpicture}
end{document}


enter image description here






share|improve this answer


























  • Thanks a lot for your great help! Your second picture looks beautiful! Would it be possible to let the graph end at the line of each bottom edge? And maybe the the "crater" in the middle not that deep? Half depth would be enough... :-)

    – Dave
    Feb 2 at 16:39






  • 1





    @Dave I added a proposal for that.

    – marmot
    Feb 2 at 16:58






  • 1





    @Dave I added a way to get a more shallow minimum. This way is not unique.

    – marmot
    Feb 2 at 18:20











  • I guess you can probably help me along with a further question as well: tex.stackexchange.com/questions/473081/…

    – Dave
    Feb 2 at 18:42














5












5








5







Something of this sort? (Up to a sign this is a so-called Mexican hat potential.)



documentclass[tikz,border=3.14mm]{standalone}
usepackage{pgfplots}
pgfplotsset{compat=1.16}

begin{document}

begin{tikzpicture}
begin{axis}[samples=20,zmin=0,zmax=1]
addplot3[surf, domain=0:1,domain y=0:360,z buffer=sort]
({x*cos(y)},{x*sin(y)},{3*(0.5*x^2-x^4)+0.5});
end{axis}
end{tikzpicture}
end{document}


enter image description here



Or, if you do



 addplot3[surf, domain=-1:1] {(x^2+y^2)-0.5*(x^2+y^2)^2};


you'll get



enter image description here



Yes, it is possible to extend the plot to the axes, but it is not as straightforward as one may think (or I am missing something obvious).



documentclass[tikz,border=3.14mm]{standalone}
usepackage{pgfplots}
pgfplotsset{compat=1.16}

begin{document}

begin{tikzpicture}[declare function={f(x,y)=(x^2+y^2)-0.5*(x^2+y^2)^2;}]
begin{axis}[samples=20,zmin=0,zmax=1,xmin=-1,xmax=1,ymin=-1,ymax=1]
% clip (-1,-1,{f(-1,-1)}) -- (1,-1,{f(1,-1)}) -- (1,1,{f(1,1)})
% -- (1,1,1) -- (-1,-1,1); % not needed
addplot3[surf, domain=-2:2,samples=50,point meta={max(f(x,y),0)}] {f(x,y)};
end{axis}
end{tikzpicture}
end{document}


enter image description here



One way to obtain a more shallow local minimum is to increase the plot range.



documentclass[tikz,border=3.14mm]{standalone}
usepackage{pgfplots}
pgfplotsset{compat=1.16}

begin{document}
begin{tikzpicture}[declare function={f(x,y)=(x^2+y^2)-0.5*(x^2+y^2)^2;}]
pgfmathsetmacro{myxmax}{2}
pgfmathsetmacro{myzmin}{f(myxmax,0)}
begin{axis}[samples=20,zmin=myzmin,zmax=1,xmin=-myxmax,xmax=myxmax,ymin=-myxmax,ymax=myxmax]
addplot3[surf, domain=-2:2,samples=50,point meta={max(f(x,y),myzmin)}] {f(x,y)};
end{axis}
end{tikzpicture}
end{document}


enter image description here






share|improve this answer















Something of this sort? (Up to a sign this is a so-called Mexican hat potential.)



documentclass[tikz,border=3.14mm]{standalone}
usepackage{pgfplots}
pgfplotsset{compat=1.16}

begin{document}

begin{tikzpicture}
begin{axis}[samples=20,zmin=0,zmax=1]
addplot3[surf, domain=0:1,domain y=0:360,z buffer=sort]
({x*cos(y)},{x*sin(y)},{3*(0.5*x^2-x^4)+0.5});
end{axis}
end{tikzpicture}
end{document}


enter image description here



Or, if you do



 addplot3[surf, domain=-1:1] {(x^2+y^2)-0.5*(x^2+y^2)^2};


you'll get



enter image description here



Yes, it is possible to extend the plot to the axes, but it is not as straightforward as one may think (or I am missing something obvious).



documentclass[tikz,border=3.14mm]{standalone}
usepackage{pgfplots}
pgfplotsset{compat=1.16}

begin{document}

begin{tikzpicture}[declare function={f(x,y)=(x^2+y^2)-0.5*(x^2+y^2)^2;}]
begin{axis}[samples=20,zmin=0,zmax=1,xmin=-1,xmax=1,ymin=-1,ymax=1]
% clip (-1,-1,{f(-1,-1)}) -- (1,-1,{f(1,-1)}) -- (1,1,{f(1,1)})
% -- (1,1,1) -- (-1,-1,1); % not needed
addplot3[surf, domain=-2:2,samples=50,point meta={max(f(x,y),0)}] {f(x,y)};
end{axis}
end{tikzpicture}
end{document}


enter image description here



One way to obtain a more shallow local minimum is to increase the plot range.



documentclass[tikz,border=3.14mm]{standalone}
usepackage{pgfplots}
pgfplotsset{compat=1.16}

begin{document}
begin{tikzpicture}[declare function={f(x,y)=(x^2+y^2)-0.5*(x^2+y^2)^2;}]
pgfmathsetmacro{myxmax}{2}
pgfmathsetmacro{myzmin}{f(myxmax,0)}
begin{axis}[samples=20,zmin=myzmin,zmax=1,xmin=-myxmax,xmax=myxmax,ymin=-myxmax,ymax=myxmax]
addplot3[surf, domain=-2:2,samples=50,point meta={max(f(x,y),myzmin)}] {f(x,y)};
end{axis}
end{tikzpicture}
end{document}


enter image description here







share|improve this answer














share|improve this answer



share|improve this answer








edited Feb 2 at 18:19

























answered Jan 27 at 14:16









marmotmarmot

110k5136255




110k5136255













  • Thanks a lot for your great help! Your second picture looks beautiful! Would it be possible to let the graph end at the line of each bottom edge? And maybe the the "crater" in the middle not that deep? Half depth would be enough... :-)

    – Dave
    Feb 2 at 16:39






  • 1





    @Dave I added a proposal for that.

    – marmot
    Feb 2 at 16:58






  • 1





    @Dave I added a way to get a more shallow minimum. This way is not unique.

    – marmot
    Feb 2 at 18:20











  • I guess you can probably help me along with a further question as well: tex.stackexchange.com/questions/473081/…

    – Dave
    Feb 2 at 18:42



















  • Thanks a lot for your great help! Your second picture looks beautiful! Would it be possible to let the graph end at the line of each bottom edge? And maybe the the "crater" in the middle not that deep? Half depth would be enough... :-)

    – Dave
    Feb 2 at 16:39






  • 1





    @Dave I added a proposal for that.

    – marmot
    Feb 2 at 16:58






  • 1





    @Dave I added a way to get a more shallow minimum. This way is not unique.

    – marmot
    Feb 2 at 18:20











  • I guess you can probably help me along with a further question as well: tex.stackexchange.com/questions/473081/…

    – Dave
    Feb 2 at 18:42

















Thanks a lot for your great help! Your second picture looks beautiful! Would it be possible to let the graph end at the line of each bottom edge? And maybe the the "crater" in the middle not that deep? Half depth would be enough... :-)

– Dave
Feb 2 at 16:39





Thanks a lot for your great help! Your second picture looks beautiful! Would it be possible to let the graph end at the line of each bottom edge? And maybe the the "crater" in the middle not that deep? Half depth would be enough... :-)

– Dave
Feb 2 at 16:39




1




1





@Dave I added a proposal for that.

– marmot
Feb 2 at 16:58





@Dave I added a proposal for that.

– marmot
Feb 2 at 16:58




1




1





@Dave I added a way to get a more shallow minimum. This way is not unique.

– marmot
Feb 2 at 18:20





@Dave I added a way to get a more shallow minimum. This way is not unique.

– marmot
Feb 2 at 18:20













I guess you can probably help me along with a further question as well: tex.stackexchange.com/questions/473081/…

– Dave
Feb 2 at 18:42





I guess you can probably help me along with a further question as well: tex.stackexchange.com/questions/473081/…

– Dave
Feb 2 at 18:42


















draft saved

draft discarded




















































Thanks for contributing an answer to TeX - LaTeX Stack Exchange!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f472073%2ftikz-pgf-how-to-draw-crater-like-3d-surface-based-on-polynomial-equations%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Сан-Квентин

8-я гвардейская общевойсковая армия

Алькесар