Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将bezier轴添加到matplotlib图形_Python_Matplotlib_Bezier - Fatal编程技术网

Python 将bezier轴添加到matplotlib图形

Python 将bezier轴添加到matplotlib图形,python,matplotlib,bezier,Python,Matplotlib,Bezier,使用库时,Curve.plot函数返回AxesSubplot对象 nodes1 = np.array([[0.0, 0.0],[0.625, .75], [1.0, 1.0]]) curve1 = bezier.Curve(nodes1, degree=2) ax = curve1.plot(num_pts=256) print ax 返回一个 AxesSubplot(0.125,0.11;0.775x0.77) 我知道创建子地块的典型方法是使用 fig = pyplot.figure()

使用库时,Curve.plot函数返回AxesSubplot对象

nodes1 = np.array([[0.0, 0.0],[0.625, .75], [1.0, 1.0]])
curve1 = bezier.Curve(nodes1, degree=2)
ax = curve1.plot(num_pts=256)
print ax
返回一个

AxesSubplot(0.125,0.11;0.775x0.77)
我知道创建子地块的典型方法是使用

fig = pyplot.figure()
ax = fig.add_subplot(111)
但是我找不到任何关于将已经创建的子图添加到图形的文档

我可以使用plt.show显示子图,但无法访问该图。如果我尝试使用plt.figure创建图,则会在不同的窗口中显示两个不同的图。

在许多Python第三方库中,包括matplotlib,您可以查看源代码,了解幕后发生的事情,通常您可以将其作为您想要做的事情的指南—甚至可能是子类实现您的自定义或修改的机会。非常简单,如果您只想绘制曲线,可以使用其代码,在您自己的bezier.curve.evaluate_multi-returns numpy.ndarray中:曲线上的点。作为二维NumPy数组,行对应于每个*s*值,列对应于维度

其中x值为点[:,0],y值为点[:,1]。根据你的实际需要。。。从


实际上,我还没有尝试过这一点-在这台机器上没有bezier。

如果目标是将曲线绘制到现有轴ax,请使用绘图函数的ax参数bezier.curve.plot…,ax:

或者,如果您在使用bezier软件包时遇到问题,那么创建bezier曲线实际上并不难。因此,您可以手动执行此操作:

import numpy as np
from scipy.special import binom
import matplotlib.pyplot as plt

bernstein = lambda n, k, t: binom(n,k)* t**k * (1.-t)**(n-k)

def bezier(points, num=200):
    N = len(points)
    t = np.linspace(0, 1, num=num)
    curve = np.zeros((num, 2))
    for i in range(N):
        curve += np.outer(bernstein(N - 1, i, t), points[i])
    return curve


nodes1 = np.array([[0.0, 0.0],[0.625, .75], [1.0, 1.0]])
curve1 = bezier(nodes1, num=256)

fig, ax = plt.subplots()

ax.plot(curve1[:,0], curve1[:,1])

plt.show()

首先,为了避免打开另一个窗口,必须关闭打印:

pyplot.close()
然后你可以执行你的命令

ax = curve1.plot(num_pts=256)
现在,我不知道为什么要引入子图111,它使用了整个窗口的单个图形。但是如果您仍然想使用较小的子图,例如221,您可以执行以下操作:

pyplot.close()
fig = pyplot.figure()
#fig = pyplot.gcf(); # This will also do
ax = fig.add_subplot(221); curve.plot(num_pts=256,ax=ax)

注意:我刚刚测试了这两种情况,它们都可以工作。只有我使用了2D节点而不是3D节点。

另一个线程的答案是创建一种方法,用于在子地块上绘制数据列表;但是,我没有数据列表,我只有AxesSubplot对象,因为我的数据来自bezier库我猜这就是您要查找的。但是,实际上并不太清楚为什么要将轴添加到不同的地物中,因为它已经在可以使用的地物中创建。如果你想更新你的问题,使之清晰,它可能会得到回答。。。。我通读了答案,认为其中至少有一个演示了如何将现有的Axis对象添加到图形中,但我实际上没有尝试。是否必须使用bezier.Curve.plot以这种方式创建子绘图?除了在图形中显示外,您还需要该AxesSubplot吗?@wwii如果您是指,那么是的,有一个答案告诉您如何将轴添加到另一个图形中,但它已存在多年,在任何较新的matplotlib版本中都不起作用。这就是为什么我添加了一个目前有效的答案。然而,我完全同意你的观点,移动轴的方法很可能不是解决这个问题的方法,我看着它,没有看到它。
pyplot.close()
ax = curve1.plot(num_pts=256)
pyplot.close()
fig = pyplot.figure()
#fig = pyplot.gcf(); # This will also do
ax = fig.add_subplot(221); curve.plot(num_pts=256,ax=ax)