当从matplotlibrc文件

时间:2018-01-18 11:58:01

标签: python matplotlib plot jupyter-notebook

我想编写一个带有函数的模块,用于从matplotlibrc文件设置默认样式参数。模块style.py的最小示例:

import matplotlib as mpl

def set_default():
    mpl.rc_file('./matplotlibrc')

如果我想在具有内联绘图的jupyter笔记本中使用该模块,则在我之前绘制任何内容之前调用style.set_default()时,不会显示内联绘图。

所以如果我打电话

%matplotlib inline
style.set_default()
plt.plot()

输出为空列表,不显示绘图。如果我打电话,例如

plt.plot()

启用内联绘图后,在调用set_default函数之前,两个plot调用的输出都以内联方式显示。

matplotlibrc文件为空时,甚至会发生这种情况,因为它在我的最小例子中。

有没有人理解为什么会发生这种情况并且知道如何解决这个问题或者如何使用matplotlibrc文件在模块中设置默认样式?

以下是jupyter笔记本中两个案例的两张图片:

inline broken

inline working

额外的问题:当加载的matplotlibrc为空时,为什么第二种情况中的第二个情节更大?

1 个答案:

答案 0 :(得分:3)

简短版本:使用mpl.style.use代替mpl.rc_file

长版:
您可以打印出正在使用的后端以查看正在发生的事情。

import matplotlib as mpl

def set_default():
    mpl.rc_file('matplotlibrc.txt') # this is an empty file

import matplotlib.pyplot as plt
print mpl.get_backend()
# This prints u'TkAgg' (in my case) the default backend in use 
#  due to my rc Params

%matplotlib inline
print mpl.get_backend()
# This prints "module://ipykernel.pylab.backend_inline", because inline has been set
set_default()
print mpl.get_backend()
# This prints "agg", because this is the default backend reset by setting the empty rc file
plt.plot()
# Here, no plot is shown because agg (a non interactive backend) is used.

直到这里没有压抑。

现在是第二个案例。

import matplotlib as mpl

def set_default():
    mpl.rc_file('matplotlibrc.txt') # this is an empty file

import matplotlib.pyplot as plt
print mpl.get_backend()
# This prints u'TkAgg' (in my case) the default backend in use, same as above

%matplotlib inline
print mpl.get_backend()
# This prints "module://ipykernel.pylab.backend_inline", because inline has been set
plt.plot()
# This shows the inline plot, because the inline backend is active.

set_default()
print mpl.get_backend()
# This prints "agg", because this is the default backend reset by setting the new empty rc file
plt.plot()
# Here comes the supprise: Although "agg" is the backend, still, an inline plot is shown.
# This is due to the inline backend being the one registered in pyplot 
#   when doing the first plot. It cannot be changed afterwards.

重点是,您可能仍会更改后端,直到生成第一个图,而不是之后。

相同的论点适用于数字大小。默认的matplotlib数字大小为(6.4,4.8),而使用内联后端设置的数字为(6.0,4.0)。图dpi也不同,默认rcParams为100,内联配置为72.。这使得情节显得更小。

现在到了实际问题。我想在这里使用样式表来设置一些样式的样式,而不是改变后端。因此,您只想从rc文件中设置样式。这可以通过常规方式使用matplotlib.style.use

完成
def set_default():
    mpl.style.use('matplotlibrc.txt')

使用它时,它不会覆盖正在使用的后端,而只会更新在文件本身中指定的那些参数。