使用Julia的Makie.jl库绘制3D坐标球体时显示2D图的问题求助
嗨!作为Julia新手遇到这个问题太正常啦,咱们一步步拆解解决:
问题核心原因
你当前的代码有两个关键问题:
scatter默认会创建2D坐标轴,除非你明确指定要3D场景;- 你用
scatter绘制的是平面点,不是真正的球体(哪怕传了3D坐标,默认还是2D轴); - 从XLSX读取的单元格数据还保留着XLSX的特殊类型,需要转换成数值数组才能被Makie正确识别。
两种解决方案(按需选择)
方案一:快速绘制「带大小的3D点」(模拟球体,适合数据量大的情况)
这种方式用scatter的markersize参数模拟球体半径,速度快,适合大量球体的场景:
using XLSX, GLMakie # 读取Excel数据 xf = XLSX.readxlsx("BunnySphereTree.xlsx") sh = xf["BunnySphereTree"] # 转换数据为数值数组(假设第一行是表头,从第二行开始取数据;无表头就去掉[2:end]) x = Float64.(sh["A"][2:end]) y = Float64.(sh["B"][2:end]) z = Float64.(sh["C"][2:end]) r = Float64.(sh["D"][2:end]) # 创建3D场景并绘制 fig = Figure() ax = Axis3(fig[1, 1]) # 明确指定3D坐标轴 scatter!(ax, x, y, z; markersize=r, color=:steelblue, transparency=true) fig # 显示图形
方案二:绘制真实的3D球体网格(视觉效果更逼真)
如果需要真正的球体曲面,用GeometryBasics库的Sphere原语配合mesh!绘制:
using XLSX, GLMakie, GeometryBasics # 读取并转换数据(同方案一) xf = XLSX.readxlsx("BunnySphereTree.xlsx") sh = xf["BunnySphereTree"] x = Float64.(sh["A"][2:end]) y = Float64.(sh["B"][2:end]) z = Float64.(sh["C"][2:end]) r = Float64.(sh["D"][2:end]) # 创建3D场景并逐个绘制球体 fig = Figure() ax = Axis3(fig[1, 1]) for i in 1:length(x) # 创建球体:中心坐标(x[i], y[i], z[i]),半径r[i] sphere = Sphere(Point3f(x[i], y[i], z[i]), r[i]) mesh!(ax, sphere; color=:lightblue, transparency=true) end fig
关键注意事项
- 必须明确指定
Axis3:这是你之前一直出2D图的核心原因!Makie默认会根据输入判断轴类型,手动指定Axis3才能强制创建3D场景。 - 转换数据类型:XLSX读取的单元格不是纯数值,用
Float64.(...)转换成数值数组才能被Makie正确解析。 - 优先向量化操作:方案一直接一次性传入所有坐标,比循环高效得多,数据量大时差异会很明显。
内容的提问来源于stack exchange,提问作者MervynLarrierII.
相关产品推荐
相关产品推荐

