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

Holoviews分组小提琴图、箱线图刻度标签格式化问题

Holoviews小提琴图/箱线图刻度标签优化方案

问题原因分析

  • 横轴标签重叠:你的dim2包含50个分类,默认显示所有标签会导致横向空间不足,标签挤压重叠。
  • 设置xticks/xformatter后无图表:小提琴图的x轴是分类轴而非数值轴,你直接用数值列表设置xticks、误用数值型的BasicTickFormatter,导致渲染出错。

正确解决方案

方案1:减少刻度数量+优化标签布局

针对分类轴,指定要保留显示的分类值,同时通过旋转标签、缩小字体提升可读性:

import hvplot
import hvplot.xarray
import xarray as xr
import numpy as np

if __name__ == "__main__":
    dim1_size = 10000
    dim2_size = 50
    xds = xr.Dataset(
        {"values": (("dim1", "dim2"), np.random.random((dim1_size, dim2_size)))},
        coords={"dim1": np.arange(dim1_size), "dim2": np.arange(dim2_size)},
    )

    # 只显示每隔10个的分类标签,旋转标签避免重叠
    p = xds.hvplot.violin("values", by="dim2").opts(
        xticks=[str(i) for i in range(0, 50, 10)],  # 分类轴需传入字符串形式的标签值
        xrotation=45,  # 旋转标签45度
        xaxis_label_text_font_size='8pt'  # 缩小标签字体
    )
    hvplot.show(p)

方案2:用分类格式化器自定义标签

如果需要更灵活的标签规则,使用Bokeh的CategoricalTickFormatter(数值型格式化器不适用于分类轴):

import hvplot
import hvplot.xarray
import xarray as xr
import numpy as np
from bokeh.models import CategoricalTickFormatter

if __name__ == "__main__":
    dim1_size = 10000
    dim2_size = 50
    xds = xr.Dataset(
        {"values": (("dim1", "dim2"), np.random.random((dim1_size, dim2_size)))},
        coords={"dim1": np.arange(dim1_size), "dim2": np.arange(dim2_size)},
    )

    # 自定义规则:只显示偶数索引的标签
    formatter = CategoricalTickFormatter(
        categories=[[str(i) for i in range(0, 50, 2)]],
        formatters={0: '%.0f'}
    )

    p = xds.hvplot.violin("values", by="dim2").opts(
        xformatter=formatter,
        xrotation=30,
        xaxis_label_text_font_size='8pt'
    )
    hvplot.show(p)

方案3:用hvplot便捷参数快速设置

hvplot提供了直接控制标签的参数,无需调用opts:

import hvplot
import hvplot.xarray
import xarray as xr
import numpy as np

if __name__ == "__main__":
    dim1_size = 10000
    dim2_size = 50
    xds = xr.Dataset(
        {"values": (("dim1", "dim2"), np.random.random((dim1_size, dim2_size)))},
        coords={"dim1": np.arange(dim1_size), "dim2": np.arange(dim2_size)},
    )

    p = xds.hvplot.violin(
        "values", 
        by="dim2", 
        xticklabels=[str(i) for i in range(0, 50, 5)],  # 指定要显示的标签
        xlabel_rotation=45,
        fontsize={'xticks': 8}
    )
    hvplot.show(p)

关键注意点

  • 用by参数生成的小提琴图/箱线图,x轴是分类轴,所有刻度设置必须针对分类值(字符串形式),而非数值位置。
  • 数值型格式化器(如BasicTickFormatter)不适用于分类轴,必须使用CategoricalTickFormatter。
  • 优化可读性的核心思路:减少显示的标签数量 + 旋转标签 + 调整字体大小。

内容的提问来源于stack exchange,提问作者Timothy W. Hilton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 09:55:09