TikZ PGF: How to draw crater-like 3D surface based on polynomial equations?
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:
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:
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
add a comment |
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:
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:
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
1
Have you tried replacing two of they
in your formula withx
?
– TeXnician
Jan 27 at 13:06
add a comment |
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:
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:
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
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:
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:
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
pgfplots 3d
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 they
in your formula withx
?
– TeXnician
Jan 27 at 13:06
add a comment |
1
Have you tried replacing two of they
in your formula withx
?
– 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
add a comment |
1 Answer
1
active
oldest
votes
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}
Or, if you do
addplot3[surf, domain=-1:1] {(x^2+y^2)-0.5*(x^2+y^2)^2};
you'll get
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}
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}
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
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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}
Or, if you do
addplot3[surf, domain=-1:1] {(x^2+y^2)-0.5*(x^2+y^2)^2};
you'll get
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}
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}
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
add a comment |
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}
Or, if you do
addplot3[surf, domain=-1:1] {(x^2+y^2)-0.5*(x^2+y^2)^2};
you'll get
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}
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}
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
add a comment |
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}
Or, if you do
addplot3[surf, domain=-1:1] {(x^2+y^2)-0.5*(x^2+y^2)^2};
you'll get
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}
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}
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}
Or, if you do
addplot3[surf, domain=-1:1] {(x^2+y^2)-0.5*(x^2+y^2)^2};
you'll get
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}
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}
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
add a comment |
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
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
1
Have you tried replacing two of the
y
in your formula withx
?– TeXnician
Jan 27 at 13:06