使用mplleaflet时出现'XAxis'无'_gridOnMajor'属性错误如何解决?
解决mplleaflet运行时的AttributeError: 'XAxis' object has no attribute '_gridOnMajor'问题
问题场景
运行以下mplleaflet代码时触发错误:
import mplleaflet import matplotlib.pyplot as plt lats = [54.3256, 53.2692, 53.8242, 53.2178] lons = [2.9356, 3.6278, 2.9453, 3.2203] fig = plt.figure() plt.plot(lons, lats, 'r.') mplleaflet.display(fig=fig)
报错核心信息:
AttributeError: 'XAxis' object has no attribute '_gridOnMajor'
完整报错回溯:
Traceback (most recent call last): Input In [2] in <cell line: 12> mplleaflet.display(fig=fig) File C:\ProgramData\Anaconda3\lib\site-packages\mplleaflet_display.py:153 in display html = fig_to_html(fig, **kwargs) File C:\ProgramData\Anaconda3\lib\site-packages\mplleaflet_display.py:84 in fig_to_html exporter.run(fig) File C:\ProgramData\Anaconda3\lib\site-packages\mplleaflet\mplexporter\exporter.py:51 in run self.crawl_fig(fig) File C:\ProgramData\Anaconda3\lib\site-packages\mplleaflet\mplexporter\exporter.py:118 in crawl_fig self.crawl_ax(ax) File C:\ProgramData\Anaconda3\lib\site-packages\mplleaflet\mplexporter\exporter.py:123 in crawl_ax props=utils.get_axes_properties(ax)): File C:\ProgramData\Anaconda3\lib\site-packages\mplleaflet\mplexporter\utils.py:267 in get_axes_properties 'axes': [get_axis_properties(ax.xaxis), File C:\ProgramData\Anaconda3\lib\site-packages\mplleaflet\mplexporter\utils.py:231 in get_axis_properties props['grid'] = get_grid_style(axis) File C:\ProgramData\Anaconda3\lib\site-packages\mplleaflet\mplexporter\utils.py:241 in get_grid_style if axis._gridOnMajor and len(gridlines) > 0: AttributeError: 'XAxis' object has no attribute '_gridOnMajor'
原因
matplotlib 3.7+版本移除了_gridOnMajor私有属性,改用公开方法get_gridvisible()或_grid_visible属性,而mplleaflet的代码未同步适配该更新,导致属性查找失败。
解决办法
方法1:降级matplotlib到兼容版本
通过conda或pip安装3.6.x版本的matplotlib:
- 使用conda:
conda install matplotlib=3.6.0
- 使用pip:
pip install matplotlib==3.6.0
方法2:修改mplleaflet的utils.py文件
找到mplleaflet安装目录下的mplexporter/utils.py(路径参考报错中的C:\ProgramData\Anaconda3\lib\site-packages\mplleaflet\mplexporter\utils.py),定位到get_grid_style函数,将:
if axis._gridOnMajor and len(gridlines) > 0:
替换为以下任意一种写法:
# 写法1:使用公开方法 if axis.get_gridvisible() and len(gridlines) > 0:
或
# 写法2:使用新版本私有属性 if axis._grid_visible and len(gridlines) > 0:
修改后保存文件,重新运行代码即可。
内容的提问来源于stack exchange,提问作者Maciej
相关产品推荐
相关产品推荐

