Jupyter Notebook加载matplotlibrc后内联绘图失效问题及解决问询
一、图像无法显示的核心原因
当你在Jupyter Notebook中执行%matplotlib inline时,IPython会自动配置Matplotlib使用module://ipykernel.pylab.backend_inline后端——这个后端专门负责将图像渲染并嵌入到Notebook单元格里。
而mpl.rc_file()函数的作用是重置所有Matplotlib配置为rc文件中的设定:如果你的rc文件是空的,它会直接回退到Matplotlib的原生默认配置,这其中就包括把后端切换回系统默认的GUI后端(比如TkAgg、QtAgg这类),而非Notebook需要的inline后端。
所以先调用style.set_default()再绘图时,Matplotlib已经用了非inline后端,无法把图像输出到Notebook里,自然只能看到plt.plot()返回的空Line2D对象列表,看不到图像。
而先绘图再加载rc文件的情况:第一次绘图时,inline后端已经初始化并绑定了对应的Figure对象,后续调用rc_file()只会修改全局配置,但不会改动已经存在的Figure的后端设置,所以两次绘图都能正常显示。
二、可行的解决方案
这里有几种靠谱的解决办法,你可以按需选择:
1. 保留当前后端加载rc文件
修改你的style.py模块,先保存当前的后端设置,加载rc文件后再恢复,这样既应用了自定义样式,又不会破坏Notebook的inline后端:
import matplotlib as mpl def set_default(): # 保存当前激活的后端 original_backend = mpl.get_backend() # 加载自定义matplotlibrc文件 mpl.rc_file('./matplotlibrc') # 恢复之前的后端配置 mpl.use(original_backend)
之后在Notebook里按正常顺序执行即可:
%matplotlib inline import style style.set_default() import matplotlib.pyplot as plt plt.plot([1,2,3])
2. 在rc文件中指定inline后端(仅Notebook环境适用)
如果你只在Jupyter Notebook里用这个rc文件,可以直接在matplotlibrc中添加一行:
backend: module://ipykernel.pylab.backend_inline
这样哪怕先加载rc文件,也会自动使用inline后端,不会出现图像不显示的问题。但要注意,这种方式在普通Python脚本(非Notebook)中加载时,可能会因为找不到inline后端而报错。
3. 使用matplotlib.style加载rc文件
Matplotlib的style模块对rc文件的处理更友好,不会轻易覆盖后端设置:
import matplotlib.style as style def set_default(): style.use('./matplotlibrc')
这种方式同样能加载自定义样式,同时避开后端重置的问题,推荐优先尝试。
三、关于“第二个图像尺寸更大”的疑问
当你加载空的matplotlibrc文件时,Matplotlib会把所有配置重置为原生默认值。而%matplotlib inline会自动设置一套适合Notebook的参数,其中就包括较小的Figure尺寸(通常是figsize=(6, 4))。加载空rc文件后,Figure尺寸会恢复为Matplotlib原生默认的(8, 6),所以第二个图像看起来更大。
内容的提问来源于stack exchange,提问作者Sebastian Schneider

