为什么从ipython笔记本生成的matplotlib图与终端版略有不同?

时间:2013-06-03 20:10:33

标签: python matplotlib ipython-notebook

我有一个奇怪的问题。使用IPython Notebook,我使用pandas和matplotlib创建了一个非常广泛的脚本来创建许多图表。 当我的修修补补完成后,我将代码复制(并清理)成一个独立的python脚本(这样我就可以将它推入svn,我的论文共同作者也可以创建图表)。

为方便起见,我再次将独立的python脚本导入笔记本并创建了许多图表:

import create_charts as cc
df = cc.read_csv_files("./data")
cc.chart_1(df, 'fig_chart1.pdf')
...

奇怪的是,我使用上述方法得到的.pdf文件与我从Windows 7终端运行独立python脚本时得到的.pdf文件略有不同。最显着的区别在于,在特定图表中,图例位于上角而不是下角。但是还有其他小的差异(边界框尺寸,字体似乎略有不同)

原因可能是什么。我该如何排除故障? (我已经关闭了我的笔记本并重新启动它,重新导入我的create_charts脚本并排除任何未保存的更改) 我的终端报告我正在使用Python 2.7.2,pip freeze | grep ipython报告ipython 0.13.1

3 个答案:

答案 0 :(得分:7)

要完成Joe的回答,内联后端(IPython / kernel / zmq / pylab / backend_inline.py)有一些默认的matplotlib参数:

# The typical default figure size is too large for inline use,
# so we shrink the figure size to 6x4, and tweak fonts to
# make that fit.
rc = Dict({'figure.figsize': (6.0,4.0),
    # play nicely with white background in the Qt and notebook frontend
    'figure.facecolor': 'white',
    'figure.edgecolor': 'white',
    # 12pt labels get cutoff on 6x4 logplots, so use 10pt.
    'font.size': 10,
    # 72 dpi matches SVG/qtconsole
    # this only affects PNG export, as SVG has no dpi setting
    'savefig.dpi': 72,
    # 10pt still needs a little more room on the xlabel:
    'figure.subplot.bottom' : .125
    }, config=True,
    help="""Subset of matplotlib rcParams that should be different for the
    inline backend."""
)

由于这对每个人来说并不明显,您可以通过c.InlineBackend.rc在配置中进行设置。

[编辑]有关可配置性的准确信息。

IPython具有大多数类具有可以配置默认值的属性的特殊性。这些通常被称为Configurable(大写C),这些属性可以在代码中轻松识别,因为它们在__init__之前被声明为:

property = A_Type( <default_value>, config=True , help="a string")

您可以通过执行来覆盖IPython配置文件中的这些属性(哪一个取决于您想要做什么)

c.ClassName.propertie_name = value

这里是你可以做的词典

#put your favorite matplotlib config here.
c.InlineBackend.rc = {'figure.facecolor': 'black'}  

猜测一个空的dict会允许内联后端使用matplotlib默认值。

答案 1 :(得分:3)

扩展马特的答案(给他很多信任,但我认为答案可能不那么复杂),这就是我最终解决它的方式。

(a)我在C:\Python27\Lib\site-packages\IPython\zmq\pylab\backend_inline.py中查找了ipython的默认matplotlib设置(参见Matt的回答)。

(b)并通过在我的脚本中插入以下代码,使用终端版本中设置的值(我使用print mpl.rcParams['figure.figsize']等来覆盖它们来查找):

import matplotlib as mpl

#To make sure we have always the same matplotlib settings
#(the ones in comments are the ipython notebook settings)

mpl.rcParams['figure.figsize']=(8.0,6.0)    #(6.0,4.0)
mpl.rcParams['font.size']=12                #10 
mpl.rcParams['savefig.dpi']=100             #72 
mpl.rcParams['figure.subplot.bottom']=.1    #.125

答案 2 :(得分:2)

字体大小问题是由于dpi的差异造成的。我猜这个图的大小略有不同(以像素为单位)也会改变图例的“最佳”位置。

默认dpi数字显示为80,而savefig默认为100.这意味着默认情况下,matplotlib数字在保存时与屏幕上显示的数字略有不同。

我不确定,但我猜测ipython笔记本将dpi设置为100以外的值(最可能是80)并在保存数字时使用它。

尝试在独立脚本中执行savefig('filename.pdf', dpi=80)