如何让 Makie 的 PolarAxis 标签更靠近扇形并减少外围留白?
可以继续使用叠加 Axis 的方案:先用 clip = false 排查极坐标遮罩是否造成遮挡,将辅助 Axis 的背景设为透明,再调整标签距离。对于固定画布过大产生的外围空白,可以用 resize_to_layout!(f) 调整画布尺寸,并通过 figure_padding 控制边距。
这些设置分别处理遮罩、标签定位和布局尺寸,单靠缩小辅助轴无法解决所有问题。
为什么标签会被遮住?
PolarAxis 使用遮罩多边形隐藏极坐标有效区域之外的内容。因此,即使标签位于扇形外侧,也可能落在遮罩覆盖范围内。官方文档提供了关闭 clip 或调整绘图对象深度的处理方式。这里先关闭遮罩,以便判断遮挡来源。PolarAxis 文档
hidedecorations! 和 hidespines! 不负责隐藏普通 Axis 的背景。用于叠加标签的辅助轴需要显式设置 backgroundcolor = :transparent。
如何修改现有示例?
下面沿用原来的叠加方式。辅助轴的尺寸和标签间距只是调整的起点,需要根据实际字体、刻度和目标位置微调。示例未在指定 Makie 版本下运行验证。
using CairoMakie
f = Figure(size = (500, 300), figure_padding = 8)
gl = f[1, 1] = GridLayout()
rmax = 2.0
θmin, θmax = -π/5, π/5
pax = PolarAxis(
gl[1, 1];
width = 220,
height = 180,
thetalimits = (θmin, θmax),
theta_0 = π/2,
thetaticklabelsize = 12,
rticklabelsize = 12,
backgroundcolor = :pink,
clip = false,
)
rlims!(pax, 0, rmax)
dummy = Axis(
gl[1, 1];
width = 200,
height = 150,
backgroundcolor = :transparent,
xlabel = "Voltage [µV]",
ylabel = "SE",
xlabelpadding = 4,
ylabelpadding = 4,
)
hidedecorations!(dummy, label = false)
hidespines!(dummy)
resize_to_layout!(f)
f
调节时先改变 xlabelpadding、ylabelpadding,再按需要改变辅助轴的 width、height。缩小辅助轴会改变标签所依附的矩形位置,但标签仍围绕普通 Axis 排列,不会自动贴合扇形的斜边。
能否直接按极坐标放置文字?
可以。PolarAxis 支持直接调用二维绘图函数,默认将位置解释为 (θ, r),其中 θ 的单位为弧度。自定义文字可以使用 text!,不必借助辅助轴。PolarAxis 绘图说明
例如,删除上面的 dummy 创建及隐藏代码,在 rlims! 之后添加:
text!(pax, θmin, 0.55 * rmax;
text = "Voltage [µV]",
align = (:left, :center),
offset = (10, -6),
rotation = π/2 + θmin,
fontsize = 14,
)
text!(pax, θmax, 0.55 * rmax;
text = "SE",
align = (:right, :center),
offset = (-10, -6),
fontsize = 14,
)
这会把文字锚点放在两条径向边上,再通过 offset 向外偏移,适合需要标签贴近斜边的情况。offset 默认以像素为单位,可以在保留数据坐标锚点的同时微调文字距离;具体偏移量取决于字体和图形尺寸。text 文档
如何减少外围空白?
原代码将画布固定为 500 × 300,而 PolarAxis 的指定尺寸为 220 × 180。布局还需要容纳刻度和标签,但未使用的画布空间可能仍然较多。
完成所有标签设置后调用 resize_to_layout!(f),可以让画布尺寸适应布局所需的空间。这会改变最终图像尺寸;如果必须保持 500 × 300,就需要相应扩大绘图区或接受剩余空白。自动画布尺寸说明
figure_padding = 8 控制内容与画布四边的距离,也可以按 (left, right, bottom, top) 分别设置。它不会裁掉扇形在矩形绘图区内部留下的空角。Figure 边距说明
还需要注意什么?
- 输入没有附上实际图片,无法仅凭蓝色、绿色标注确定每一块空白属于哪一层。应分别检查画布边距、布局空间和绘图区内部空白。
clip = false会让原本被遮罩隐藏的绘图内容显示出来。加入实际数据后,要检查是否有线条或图形越出扇形。text!添加的文字不会像布局中的Label一样自动为自身预留空间。文字超出 scene 或画布边界时,关闭极坐标遮罩也不能保证完整显示。- 原示例中的
tri_pts只定义了点,没有传给绘图函数,因此不会生成三角形,也不会改变布局。
备注:内容仅供参考。
