You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Bokeh多分类图中旋转主次坐标轴刻度标签?

解决Bokeh多分类图中主次坐标轴刻度标签旋转的问题

我完全懂你遇到的痛点——当分类数量一多,不管是主分类还是子分类的刻度标签,挤在一起根本没法看。主坐标轴的刻度旋转咱们已经搞定了,下面针对两种常见的多分类场景,给你讲清楚次刻度标签的旋转方法:

1. 嵌套分类轴(主+子分类)的标签旋转

如果你的多分类图是用FactorRange实现的嵌套分类(外层主分类、内层子分类),Bokeh专门提供了两个参数分别控制主次分类标签的旋转:

  • major_label_orientation:控制**主分类(外层)**的标签旋转
  • group_label_orientation:控制**子分类(内层)**的标签旋转

举个完整的示例:

from bokeh.plotting import figure, show
from bokeh.models import ColumnDataSource, FactorRange

# 构造嵌套分类数据
main_cats = ["电子产品", "家居用品", "服装鞋帽", "食品饮料", "美妆护肤"]
sub_cats = ["Q1", "Q2", "Q3", "Q4"]
factors = [(main, sub) for main in main_cats for sub in sub_cats]

source = ColumnDataSource(data={
    "x": factors,
    "sales": [120, 150, 90, 110, 
              80, 100, 70, 95, 
              100, 130, 85, 120, 
              140, 160, 110, 135, 
              90, 110, 75, 105]
})

# 创建带嵌套分类轴的图表
p = figure(
    x_range=FactorRange(factors=factors),
    y_range=(0, 200),
    title="各品类季度销售额",
    x_axis_label="品类-季度",
    y_axis_label="销售额(元)"
)

# 绘制分组柱状图
p.vbar(x="x", top="sales", width=0.8, source=source, color="#2c3e50")

# 旋转主分类标签(外层)为45度(用弧度表示,π/4≈0.785)
p.xaxis.major_label_orientation = 0.785
# 旋转子分类标签(内层)为45度
p.xaxis.group_label_orientation = 0.785

# 调整标签字号,进一步避免重叠
p.xaxis.major_label_text_font_size = "10pt"
p.xaxis.group_label_text_font_size = "9pt"

show(p)

这样设置后,主、子分类的标签都会倾斜45度,完美解决重叠问题。

2. 额外添加的主次坐标轴(双轴)的标签旋转

如果你的场景是添加了额外的坐标轴(比如双y轴、双x轴),需要先获取到次坐标轴的对象,再设置它的major_label_orientation参数:

示例:双y轴的次轴标签旋转

from bokeh.plotting import figure, show
from bokeh.models import ColumnDataSource, LinearAxis, Range1d

# 构造示例数据
source = ColumnDataSource(data={
    "months": ["1月", "2月", "3月", "4月", "5月", "6月"],
    "sales": [1200, 1500, 1100, 1300, 1600, 1400],
    "profit_rate": [0.25, 0.28, 0.22, 0.26, 0.30, 0.27]
})

# 创建主图表
p = figure(
    x_range=source.data["months"],
    y_range=(0, 2000),
    title="月度销售额与利润率",
    x_axis_label="月份",
    y_axis_label="销售额(元)"
)

# 绘制主y轴的柱状图
p.vbar(x="months", top="sales", width=0.6, source=source, color="#3498db")

# 添加次y轴(利润率)
p.extra_y_ranges = {"profit": Range1d(start=0, end=0.4)}
p.add_layout(LinearAxis(y_range_name="profit", axis_label="利润率"), 'right')
# 绘制次y轴的折线图
p.line(x="months", y="profit_rate", source=source, y_range_name="profit", 
       color="#e74c3c", line_width=2)

# 旋转主x轴标签
p.xaxis.major_label_orientation = 0.785
# 旋转次y轴的标签(通过p.right[0]获取右侧的次轴对象)
p.right[0].major_label_orientation = 0.785

show(p)

这里的关键是通过p.right[0](如果是次x轴则用p.below[0]p.above[0])获取到次坐标轴的实例,然后设置标签旋转角度。

需要注意的是,Bokeh里的角度都是用弧度表示的,45度对应π/4≈0.785,90度对应π/2≈1.5708,你可以根据需求调整数值。

内容的提问来源于stack exchange,提问作者gussilago

火山引擎 最新活动