我试图从Jake Vanderplas中保存一个简单的matplotlib动画,但我一直在努力OSError: [Errno 13] Permission denied.
我应该注意到,我对Jake Vanderplas的例子进行了两次小修改.我安装FFMPEG从MacPorts的,所以我增加了行plt.rcParams['animation.ffmpeg_path'] = '/opt/local/bin'和我跑进(所讨论的问题使用的FFmpeg和IPython的),所以我加入FFwriter = animation.FFMpegWriter().
这是代码:
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation
plt.rcParams['animation.ffmpeg_path'] = '/opt/local/bin'
fig = plt.figure()
ax = plt.axes(xlim=(0, 2), ylim=(-2, 2))
line, = ax.plot([], [], lw=2)
def init():
line.set_data([], [])
return line,
def animate(i):
x = np.linspace(0, 2, 1000)
y = np.sin(2 * np.pi * (x - 0.01 * i))
line.set_data(x, y) …Run Code Online (Sandbox Code Playgroud) 我想在matplotlib图中的某些文本周围获取边界框(尺寸).这里的帖子帮助我意识到我可以使用该方法text.get_window_extent(renderer)获取边界框,但我必须提供正确的渲染器.有些后端没有这个方法figure.canvas.get_renderer(),所以我试图matplotlib.backend_bases.RendererBase()获得渲染器并且它没有产生令人满意的结果.这是一个简单的例子
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
fig = plt.figure()
ax = plt.subplot()
txt = fig.text(0.15,0.5,'afdjsklhvvhwd', fontsize = 36)
renderer1 = fig.canvas.get_renderer()
renderer2 = mpl.backend_bases.RendererBase()
bbox1 = txt.get_window_extent(renderer1)
bbox2 = txt.get_window_extent(renderer2)
rect1 = Rectangle([bbox1.x0, bbox1.y0], bbox1.width, bbox1.height, \
color = [0,0,0], fill = False)
rect2 = Rectangle([bbox2.x0, bbox2.y0], bbox2.width, bbox2.height, \
color = [1,0,0], fill = False)
fig.patches.append(rect1)
fig.patches.append(rect2)
plt.draw()
Run Code Online (Sandbox Code Playgroud)
这会产生以下情节:

显然红色框太小了.我认为保罗的答案在这里找到了同样的问题.黑匣子看起来很棒,但我不能使用MacOSX后端,或任何其他没有这种方法的后端figure.canvas.get_renderer(). …
当我给matplotlib一个注释字符串,如
'$\frac{A}{B} = C$'
Run Code Online (Sandbox Code Playgroud)
我指定的字体大小为18,A和B的渲染速度为12.6 pt,而C的渲染速度为18 pt.我希望A,B和C都是相同的大小.我该怎么做呢?
在LaTeX文档中,如果您提供命令
\begin{equation}
\frac{A}{B} = C
\end{equation}
Run Code Online (Sandbox Code Playgroud)
你得到一个分数,其中A,B和C都是相同的大小,但如果你这样做
$\frac{A}{B} = C$
Run Code Online (Sandbox Code Playgroud)
与文本内联,你得到的A和B渲染为12.6 pt,而C则渲染为18 pt.因此看来matplotlib的mathtext正在模仿LaTeX的内联模式.在LaTeX中你可以写
$\displaystyle\frac{A}{B} = C$
Run Code Online (Sandbox Code Playgroud)
然后A,B和C都是相同的大小,即使在内联模式下也是如此.我在matplotlib中尝试了这个,但mathtext没有识别命令\ displaystyle.=(
有没有办法让这个在Matplotlib的mathtext中工作,或者我在我的.matplotlibrc文件中将text.usetex更改为true?(如果可能的话,我想继续使用mathtext,因为它要快得多.)
我的设置:matplotlib v1.2.0 python 2.7 OS X 10.8
我在让 sphinx 创建模块汇总表时遇到问题。我已添加sphinx.ext.autosummary到我的conf.py文件中并且正在使用numpydoc. Sphinx 似乎为类上的属性和方法创建汇总表,但它不会为包含该类的模块创建汇总表。
我创建了一个最小工作示例(MWE)来测试这一点。MWE 项目只有一个__init__.py和 ,它导入generic_module. 其内容为generic_module:
def foo(a, b):
"""
Adds a + b
"""
return(a+b)
def bar(a, b):
"""
Subtracts a + b
"""
return(a-b)
class onetwo(object):
"""
Adds 1 or 2
"""
def __init__(self):
self.whatever = 1
def one(self, a):
"""
Adds one to a
"""
return(a + 1)
def two(self,a):
"""
Adds two o a
"""
return(a + 2)
Run Code Online (Sandbox Code Playgroud)
Sphinx 自动文档foo …
当您在 Matplotlib 的 savefig() 函数中设置 bbox_inches = 'tight' 时,它会尝试找到封装图形窗口中所有内容的最紧密的边界框。不幸的是,最紧密的边界框似乎包括不可见的轴。
例如,这里是一个片段,其中设置 bbox_inches = 'tight' 可以根据需要工作:
import matplotlib.pylab as plt
fig = plt.figure(figsize = (5,5))
data_ax = fig.add_axes([0.2, 0.2, 0.6, 0.6])
data_ax.plot([1,2], [1,2])
plt.savefig('Test1.pdf', bbox_inches = 'tight', pad_inches = 0)
Run Code Online (Sandbox Code Playgroud)
它产生:

保存的 pdf 的边界对应于内容的边界。这很好,除了我喜欢使用一组不可见图形轴来放置注释。如果不可见轴超出可见内容的边界,则 pdf 边界大于可见内容。例如:
import matplotlib.pylab as plt
fig = plt.figure(figsize = (5,5))
fig_ax = fig.add_axes([0, 0, 1, 1], frame_on = False)
fig_ax.xaxis.set_visible(False)
fig_ax.yaxis.set_visible(False)
data_ax = fig.add_axes([0.2, 0.2, 0.6, 0.6])
data_ax.plot([1,2], [1,2])
plt.savefig('Test2.pdf', bbox_inches = 'tight', pad_inches = 0)
Run Code Online (Sandbox Code Playgroud)
生产 …
我发现图像对象的get_window_extent方法给出全零。
例如
import numpy as np
import matplotlib.pyplot as plt
im = np.array([[0.25, 0.75, 1.0, 0.75], [0.1, 0.65, 0.5, 0.4], \
[0.6, 0.3, 0.0, 0.2], [0.7, 0.9, 0.4, 0.6]])
fig = plt.figure()
ax = plt.subplot()
ax.set_xlim(0,1)
ax.set_ylim(0,1)
im_obj = ax.imshow(im, extent = [0.25, 0.75, 0.25, 0.75], interpolation = 'nearest')
Run Code Online (Sandbox Code Playgroud)
产生以下情节
现在,我想获取显示坐标中的图像大小,因此我执行以下操作:
fig.canvas.draw()
renderer = fig.canvas.renderer
im_bbox = im_obj.get_window_extent(renderer)
Run Code Online (Sandbox Code Playgroud)
麻烦是print im_bbox产生的Bbox('array([[ 0., 0.],\n [ 0., 0.]])')。该方法.get_window_extent(renderer)适用于文本,行和补丁,因此我惊讶地发现它不适用于图像。这是一个错误,还是我做错了什么?
万一重要,我将Matplotlib 1.3.0与TkAgg后端一起使用。
编辑:
这是一种在显示坐标中获取图像边界框的方法
im_ext = im_obj.get_extent()
im_pts = …Run Code Online (Sandbox Code Playgroud) 我创建了一个名为clearplot的包,它环绕着 matplotlib。我还创建了一个不错的字体,我想与我的包一起分发。我查阅了 Python Packaging User guide 的这一部分,并决定我应该使用data_files关键字。我选择了data_files而不是package_data因为我需要在我的包之外的matplotlib 目录中安装字体。
这是我对setup.py文件的第一次有缺陷的尝试:
from distutils.core import setup
import os, sys
import matplotlib as mpl
#Find where matplotlib stores its True Type fonts
mpl_data_dir = os.path.dirname(mpl.matplotlib_fname())
mpl_ttf_dir = os.path.join(mpl_data_dir, 'fonts', 'ttf')
setup(
...(edited for brevity)...
install_requires = ['matplotlib >= 1.4.0, !=1.4.3', 'numpy >= 1.6'],
data_files = [
(mpl_ttf_dir, ['./font_files/TeXGyreHeros-txfonts/TeXGyreHerosTXfonts-Regular.ttf']),
(mpl_ttf_dir, ['./font_files/TeXGyreHeros-txfonts/TeXGyreHerosTXfonts-Italic.ttf'])]
)
#Try to delete matplotlib's fontList cache
mpl_cache_dir = mpl.get_cachedir() …Run Code Online (Sandbox Code Playgroud) 我正在使用Spyder IDE,我发现matplotlib图形窗口总是显示在其他窗口后面.例如,在启动Spyder之后,如果我输入plt.plot([0,1],[0,1])控制台,我会在主Spyder窗口后面得到一个图.如何在所有其他窗口的顶部显示新的图形窗口?
我找到了这个解决方案(让matplotlib绘图窗口弹出作为活动窗口),但它在Spyder中对我不起作用.我遇到了麻烦fig.canvas.manager.window.它说AttributeError: 'FigureManagerMac' object has no attribute 'window'.
您如何建议将一个容器(如字典)添加到python中的预先存在的对象中?我只是搞乱Line2Dmatplotlib中的一个对象,我发现我可以通过以下方法添加字典
import matplotlib as mpl
line2D_obj = mpl.lines.Line2D([0,1], [0,0])
line2D_obj.labels = dict( text = '$\delta$', ndx = 30, leader_length = 15, leader_angle = 120)
Run Code Online (Sandbox Code Playgroud)
在line2D_obj没有足够的方法.labels,当它被实例化.我刚刚创建,.labels因为我想在Line2D对象中存储一些数据.这是一个好方法吗?如果没有,你还有什么建议?
如果它很重要,我正在调查的原因是我正在尝试创建一个自定义函数来标记Line2Dmatplotlib中的对象.以前,我以为我只是将我的标签函数交给一堆嵌套列表,a.la.
labels = [[[axis1_curve_1_label], [axis1_curve2_label]], [[axis2_curve1_label]]]
Run Code Online (Sandbox Code Playgroud)
但这很麻烦,很难遵循.我现在认为有更好的方法.我的绘图代码将数据轴输出为一个被调用的轴列表data_ax,因此这些Line2D对象很好地组织成一个名为的列表lines.例如,如果我想在数据轴2上标记曲线3,我可以简单地键入
data_ax[2].lines[3].labels = dict( text = '$\delta$', ndx = 30, leader_length = 15, leader_angle = 120)
Run Code Online (Sandbox Code Playgroud)
很清楚我标注的是哪条曲线.然后我可以将data_ax对象传递给我的标签功能,它可以为每条曲线挑选标签信息.
python ×9
matplotlib ×8
animation ×1
autodoc ×1
distutils ×1
latex ×1
numpydoc ×1
pdf ×1
setuptools ×1
spyder ×1