9

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

为方便起见,我再次将独立的 python 脚本导入到 notebook 中,并创建了一些图表:

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

4

3 回答 3

8

为了完成 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."""
)

由于这对每个人都不是很明显,您可以通过 .config 在 config 中设置它c.InlineBackend.rc

[编辑] 关于可配置性的精确信息。

IPython 的特点是大多数类都具有可以配置默认值的属性。这些通常被称为Configurable(大写 C),这些属性可以很容易地在代码中被识别,因为它们之前是这样声明的__init__

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

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

c.ClassName.propertie_name = value

在这里,你可以做一个 dict

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

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

于 2013-06-03T20:46:02.997 回答
3

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

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

(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
于 2013-06-04T19:48:17.013 回答
2

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

图形显示的默认 dpi 为 80,而savefig默认为 100。这意味着默认情况下,matplotlib 图形在保存时与屏幕上显示的图形相比看起来会略有不同。

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

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

于 2013-06-03T20:20:25.283 回答