使用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()
ax = fig.add_subplot(111)
但是我找不到任何关于将已经创建的子图添加到图中的文档。
我可以使用plt.show()显示子图,但无法访问该图。如果我尝试使用plt.figure()创建一个图形,则会显示两个不同的图形(在不同的窗口中)。
答案 0 :(得分:0)
在许多Python 第三方库(包括matplotlib)中,您可以查看源代码并查看幕后发生的事情,通常您可以将其用作指导您想要的内容做 - 甚至可能是子类实现自定义的机会。 bezier.Curve.plot
source非常简单,如果您的意图是绘制曲线,则可以使用自己的代码(bezier.Curve.evaluate_multi
返回numpy.ndarray: The points on the curve. As a two dimensional NumPy array, with the rows corresponding to each *s* value and the columns to the dimension.
nodes1 = np.array([[0.0, 0.0],[0.625, .75], [1.0, 1.0]])
curve1 = bezier.Curve(nodes1, degree=2)
# if you need to create x values.
s_vals = np.linspace(0.0, 1.0, num_pts)
points = curve1.evaluate_multi(s_vals)
x值为points[:, 0]
且y值为points[:, 1]
的位置。取决于您实际需要的...(来自pylab_examples example code: subplots_demo.py
f, (ax1, ax2) = plt.subplots(1, 2, sharey=True)
ax1.plot(points[:, 0], points[:, 1])
ax1.set_title('Sharing Y axis')
ax2.scatter(points[:, 0], points[:, 1])
我实际上没有尝试过这个 - 在这台机器上缺少bezier
。
答案 1 :(得分:0)
如果目标是将曲线绘制到现有轴ax
,请使用绘图函数的ax
参数bezier.Curve.plot(..., ax)
:
nodes1 = np.array([[0.0, 0.0],[0.625, .75], [1.0, 1.0]])
curve1 = bezier.Curve(nodes1, degree=2)
# create axes with matplotlib
fig, ax = plt.subplots()
# plot curve to existing axes
curve1.plot(num_pts=256, ax=ax)
或者,如果您在使用贝塞尔曲线包时遇到问题,那么创建贝塞尔曲线实际上并不那么难。所以你可以手动完成:
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()
答案 2 :(得分:0)
首先,要避免打开另一个窗口,必须“关闭”绘图:
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。)