如何解决使用 Plots 或 PyPlot 在 Julia 中绘制 3D 表面
我想绘制一个两个变量的函数(代码中的 e_pos 和 e_neg)。这里,t 和 a 是常数,我给它赋值为 1。
t = 1
a = 1
kx = ky = range(3.14/a,step=0.1,3.14/a)
# Doing a meshgrid for values of k
KX,KY = kx'.*ones(size(kx)[1]),ky'.*ones(size(ky)[1])
e_pos = +t.*sqrt.((3 .+ (4).*cos.((3)*KX*a/2).*cos.(sqrt(3).*KY.*a/2) .+ (2).*cos.(sqrt(3).*KY.*a)));
e_neg = -t.*sqrt.((3 .+ (4).*cos.((3)*KX*a/2).*cos.(sqrt(3).*KY.*a/2) .+ (2).*cos.(sqrt(3).*KY.*a)));
using Plots
plot(KX,KY,e_pos,st=:surface,cmap="inferno")
如果我以这种方式使用 Plots,有时我会得到一个没有表面的空 3D 平面。我究竟做错了什么?我认为这可能与我为 kx 和 ky 所做的网格有关,但我不确定。
编辑:我也收到以下错误:
解决方法
我在代码中更改了一些内容。
首先,我将变量保留为范围。其次,我只是简单地计算了我需要的函数,而没有将变量映射到它们上。代码如下:
t = 2.8
a = 1
kx = range(-pi/a,stop = pi/a,length=100)
ky = range(-pi/a,length=100)
#e_pos = +t*np.sqrt(3 + 4*np.cos(3*KX*a/2)*np.cos(np.sqrt(3)*KY*a/2) + 2*np.cos(np.sqrt(3)*KY*a))
e_pos(kx,ky) = t*sqrt(3+4cos(3*kx*a/2)*cos(sqrt(3)*ky*a/2) + 2*cos(sqrt(3)*ky*a))
e_neg(kx,ky) = -t*sqrt(3+4cos(3*kx*a/2)*cos(sqrt(3)*ky*a/2) + 2*cos(sqrt(3)*ky*a))
# Sort of broadcasting?
e_posfunc = e_pos.(kx,ky);
e_negfunc = e_neg.(kx,ky);
对于绘图,我只是使用了 GR 后端:
using Plots
gr()
plot(kx,ky,e_pos,st=:surface)
plot!(kx,e_neg,st=:surface,xlabel="kx",ylabel="ky",zlabel="E(k)")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。