如何在轴关联状态下修复散点图的1:1纵横比?
解决散点图边缘密度图的轴相等问题
需求:制作带边缘密度图的散点图,要求散点图x、y轴范围固定为[-4,4]且纵横比为1,但现有代码无法实现轴视觉长度相等的效果。
现有代码(接近需求但轴不等):
using CairoMakie n = 3000 r = randn(2,3000) x = @view r[1,:] y = @view r[2,:] fig = Figure(resolution = (1000, 1000), font = "sans", fontsize = 20) ax1 = (Axis(fig[1, 1])) density!(ax1, y; bins = 20, color = :orange, strokewidth = 1, strokecolor = :black, label = "20 bins", aspect=1) ax3 = Axis(fig[2, 1]; xlabel = "value", ylabel = "value") ax4 = Axis(fig[2, 2]; xlabel = "value", ylabel = "counts") scatter!(ax3, x, y; markersize = 4, color = :black,label="samples") axislegend(ax3; position = :rt) density!(ax4, x; label = "default",direction=:y) rowsize!(fig.layout, 2, Auto(3)) colsize!(fig.layout, 1, Auto(3)) xlims!(ax3,-4,4) ylims!(ax3,-4,4) linkxaxes!(ax1, ax3) linkyaxes!(ax3, ax4) fig
当前问题:散点图的x、y轴视觉长度不相等,不符合1:1纵横比要求。
修改后的代码(实现轴相等+正确布局)
using CairoMakie n = 3000 r = randn(2,3000) x = @view r[1,:] y = @view r[2,:] fig = Figure(resolution = (1000, 1000), font = "sans", fontsize = 20) # 上方y轴密度图 ax1 = Axis(fig[1, 1], ylabelvisible=false, xticklabelsvisible=false) density!(ax1, y; bins=20, color=:orange, strokewidth=1, strokecolor=:black, label="20 bins") xlims!(ax1, -4, 4) # 和散点图y轴范围对齐 # 散点图(核心,强制纵横比1:1) ax3 = Axis(fig[2, 1]; xlabel="value", ylabel="value", aspect=1) scatter!(ax3, x, y; markersize=4, color=:black, label="samples") axislegend(ax3; position=:rt) xlims!(ax3, -4, 4) ylims!(ax3, -4, 4) # 右侧x轴密度图 ax4 = Axis(fig[2, 2], xlabelvisible=false, yticklabelsvisible=false) density!(ax4, x; label="default", direction=:y) ylims!(ax4, -4, 4) # 和散点图x轴范围对齐 # 布局尺寸调整:让散点图区域占主要空间,密度图区域适配 rowsize!(fig.layout, 1, Relative(0.2)) # 上方密度图占20%高度 rowsize!(fig.layout, 2, Relative(0.8)) # 散点图占80%高度 colsize!(fig.layout, 1, Relative(0.8)) # 散点图占80%宽度 colsize!(fig.layout, 2, Relative(0.2)) # 右侧密度图占20%宽度 # 关联轴确保范围同步 linkyaxes!(ax1, ax3) linkxaxes!(ax3, ax4) fig
关键修改点说明
- 给散点图轴
ax3设置aspect=1,强制x、y轴视觉长度1:1 - 用
Relative设置布局的行/列尺寸,精准控制各区域占比,避免Auto尺寸的不确定性 - 手动对齐密度图和散点图的轴范围,确保边缘密度图的范围和散点图一致
- 隐藏密度图的冗余轴标签/刻度,让布局更简洁美观
- 修正轴关联逻辑:上方密度图关联散点图的y轴,右侧密度图关联散点图的x轴,确保范围同步
内容的提问来源于stack exchange,提问作者Alec
相关产品推荐
相关产品推荐

