我有一个奇怪的问题。使用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
答案 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)
。