小编Str*_*tch的帖子

无法保存与ffmpeg的matplotlib动画

我试图从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)

python animation matplotlib

15
推荐指数
1
解决办法
2万
查看次数

matplotlib:获取文本边界框,独立于后端

我想在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(). …

python matplotlib

9
推荐指数
1
解决办法
4130
查看次数

matplotlib mathtext\frac太小了

当我给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

python latex matplotlib

6
推荐指数
1
解决办法
2874
查看次数

Sphinx autosummary:创建模块的摘要

我在让 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 …

python python-sphinx autodoc numpydoc

6
推荐指数
0
解决办法
1058
查看次数

matplotlib savefig bbox_inches = 'tight' 不会忽略不可见的轴

当您在 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)

生产 …

python pdf matplotlib

5
推荐指数
1
解决办法
9498
查看次数

Matplotlib:image.get_window_extent(renderer)产生全零

我发现图像对象的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)

python matplotlib

5
推荐指数
1
解决办法
2265
查看次数

如何使用我的 python 包分发字体?

我创建了一个名为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)

python distutils matplotlib setuptools

5
推荐指数
1
解决办法
1567
查看次数

如何在Spyder中的所有其他窗口的顶部显示matplotlib图形窗口

我正在使用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 matplotlib spyder

3
推荐指数
1
解决办法
2万
查看次数

在python中将容器添加到pre-exisiting对象的简单但正确的方法是什么?

您如何建议将一个容器(如字典)添加到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 matplotlib

1
推荐指数
1
解决办法
157
查看次数