Bokeh绘制半径1的圆形出现畸变,为何无法贴合y轴范围?
Bokeh绘制圆形畸变问题的解决方案
问题描述
使用Python的Bokeh库绘制半径为1的圆形时,出现可视化畸变:x轴方向正常覆盖±1范围,但y轴方向仅接近±0.95,未达到预期的±1。已尝试设置aspect_ratio和match_aspect=True,问题仍未解决。运行于Jupyter Notebook的代码如下:
from bokeh.io import output_notebook, output_file, show from bokeh.models import Circle from bokeh.plotting import figure # 创建宽高比为1的画布 p = figure(width=500, height=500, x_range=(-1.2, 1.2), y_range=(-1.2, 1.2), tools='tap', title='Distorted Circle!', aspect_ratio=1, match_aspect=True) # 绘制圆形 circle = Circle(x=0, y=0, radius=1, fill_color='lightblue', line_color='black') p.add_glyph(circle) output_notebook() show(p, match_aspect=True)
可视化效果表现为:圆形在y轴方向被压缩,无法触及y轴的±1刻度线。
解决方法
方法1:改用Ellipse替代Circle
Circle组件的半径默认基于x轴数据单位计算,当画布渲染的像素比例与数据比例存在偏差时,会导致y轴方向尺寸失真。改用Ellipse并同时指定x、y方向的直径(对应半径1的话,直径为2),可强制保证数据空间中的对称:
from bokeh.io import output_notebook, show from bokeh.models import Ellipse from bokeh.plotting import figure p = figure(width=500, height=500, x_range=(-1.2, 1.2), y_range=(-1.2, 1.2), tools='tap', title='Correct Circle!', aspect_ratio=1, match_aspect=True) # 用Ellipse指定x、y方向的直径均为2(对应半径1) ellipse = Ellipse(x=0, y=0, width=2, height=2, fill_color='lightblue', line_color='black') p.add_glyph(ellipse) output_notebook() show(p, match_aspect=True)
方法2:使用figure.circle()绘图函数
Bokeh的figure.circle()内置了坐标轴比例适配逻辑,能自动确保圆形的视觉效果正确,无需手动处理比例问题:
from bokeh.io import output_notebook, show from bokeh.plotting import figure p = figure(width=500, height=500, x_range=(-1.2, 1.2), y_range=(-1.2, 1.2), tools='tap', title='Correct Circle!', aspect_ratio=1, match_aspect=True) # 直接调用figure的circle方法绘制圆形 p.circle(x=0, y=0, radius=1, fill_color='lightblue', line_color='black') output_notebook() show(p, match_aspect=True)
原理说明
Circle是单半径图形,其半径仅参考x轴数据单位,当画布的实际像素比例与数据比例不匹配时,y轴方向的显示会被拉伸或压缩。Ellipse支持分别定义x、y方向的尺寸,能强制保证数据空间中的对称性;figure.circle()则会自动适配坐标轴的比例关系,确保圆形视觉上无畸变。
内容的提问来源于stack exchange,提问作者ameerosein
相关产品推荐
相关产品推荐

