Julia GLMakie极坐标曲面图颜色偏暗及伪影问题求助
问题解决方法
1. 消除GLMakie中的亮线伪影
GLMakie的PolarAxis与surface!结合时,极坐标转换的三角化逻辑可能导致局部拉伸伪影。可通过两种方式解决:
- 切换至
CairoMakie(已验证有效),适合静态图片输出场景。 - 若需保留GLMakie,将极坐标数据转换为笛卡尔坐标后,使用普通
Axis绘制,绕开PolarAxis的直接映射:# 转换为笛卡尔坐标 X = [R[ir] * cos(THETA[itheta]) for itheta in 1:ntheta, ir in 1:nr] Y = [R[ir] * sin(THETA[itheta]) for itheta in 1:ntheta, ir in 1:nr] # 使用普通Axis替代PolarAxis ax1 = Axis(fig[1,1], aspect=DataAspect()) p = surface!(ax1, X, Y, MOL_DENSITY, colormap=:hot)
2. 修复颜色偏暗问题
颜色偏暗是因为Makie的surface!默认开启光照效果,而色条直接基于原始数据值映射,不受光照影响。只需关闭光照即可让曲面颜色与色条完全匹配:
p = surface!(ax1, THETA, R, MOL_DENSITY, colormap=:hot, lighting=NoLighting())
完整修正代码
GLMakie版本(消除伪影+颜色匹配)
using GLMakie rmin=1.0 rmax=200.0 nr=75 ntheta=75 R=Float64[rmin*(rmax/rmin)^((i-1.0)/(nr-1.0)) for i=1:nr] THETA=Float64[(pi/2-pi/2*(i-1.0)/(ntheta-1.0)) for i=1:ntheta] MOL_DENSITY=Array{Float64,2}(undef,ntheta,nr) for itheta=1:ntheta for ir=1:nr MOL_DENSITY[itheta,ir]=log(1.0/(R[ir]*(THETA[itheta]-pi/4+0.1)^2.0)) end end # 转换为笛卡尔坐标 X = [R[ir] * cos(THETA[itheta]) for itheta in 1:ntheta, ir in 1:nr] Y = [R[ir] * sin(THETA[itheta]) for itheta in 1:ntheta, ir in 1:nr] fig=Figure(fontsize=22,size=(700,600)) ax1=Axis(fig[1,1], aspect=DataAspect()) p=surface!(ax1, X, Y, MOL_DENSITY, colormap=:hot, lighting=NoLighting()) Colorbar(fig[1,2],p) save("test_fixed.png",fig)
CairoMakie版本(保留PolarAxis+颜色匹配)
using CairoMakie # 数据部分与原代码一致 rmin=1.0 rmax=200.0 nr=75 ntheta=75 R=Float64[rmin*(rmax/rmin)^((i-1.0)/(nr-1.0)) for i=1:nr] THETA=Float64[(pi/2-pi/2*(i-1.0)/(ntheta-1.0)) for i=1:ntheta] MOL_DENSITY=Array{Float64,2}(undef,ntheta,nr) for itheta=1:ntheta for ir=1:nr MOL_DENSITY[itheta,ir]=log(1.0/(R[ir]*(THETA[itheta]-pi/4+0.1)^2.0)) end end fig=Figure(fontsize=22,size=(700,600)) ax1=PolarAxis(fig[1,1]) thetalims!(ax1,0,pi/2) rlims!(ax1,0,rmax) p=surface!(ax1,THETA,R,MOL_DENSITY,colormap=:hot, lighting=NoLighting()) Colorbar(fig[1,2],p) save("test_cairo_fixed.png",fig)
内容的提问来源于stack exchange,提问作者Pierre Marchand
相关产品推荐
相关产品推荐

