如何在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




