You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Julia的Makie.jl库绘制3D坐标球体时显示2D图的问题求助

嗨!作为Julia新手遇到这个问题太正常啦,咱们一步步拆解解决:

问题核心原因

你当前的代码有两个关键问题:

  1. scatter默认会创建2D坐标轴,除非你明确指定要3D场景;
  2. 你用scatter绘制的是平面点,不是真正的球体(哪怕传了3D坐标,默认还是2D轴);
  3. 从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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 17:38:12