首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用matplotlib填充动画形状?

如何用matplotlib填充动画形状?
EN

Stack Overflow用户
提问于 2021-01-01 19:54:25
回答 2查看 385关注 0票数 1

我想要绘制两个任意多边形(使用形状计算面积,相交,因为我不知道另一种方法),然后填充交点,以及形状,因为他们相交和移动在动画。

在搜索之后,我想不出如何实现它。

我审查了:

  • set_fill
  • matplotlib艺术家文档reference
  • fill_between
  • animation
  • add_patch

但是,我认为我在这里一定缺少一些基本的东西,或者它可能不支持在动画期间填充对象,因为我能找到的唯一填充对象示例是静态图。

示例代码(最小示例,有两个形状)如下所示,并已在python 3中测试为功能性代码。

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt
import shapely.geometry as sg
from matplotlib.animation import FuncAnimation

fig, ax = plt.subplots()

xdata, ydata = [],[]
x2data, y2data = [],[]

ln, = plt.plot([],[])
ln2, = plt.plot([],[])

def init():
    ax.axis('equal')
    ax.set_xlim(-4, 4)
    ax.set_ylim(-4, 4)
    return ln,ln2,
 
def update(frame):
    fig.text(0,0, 'hello')
    circ1 = sg.Point(frame-2,0).buffer(1.0)
    circ2 = sg.Point(-frame+2,0).buffer(1.0)

    x,y = circ1.exterior.xy
    x2,y2 = circ2.exterior.xy
    
    intersection = circ1.intersection(circ2)
    
    xdata.append(x)
    ydata.append(y)
     
    x2data.append(x2)
    y2data.append(y2)

    ln.set_data(x,y)
    ln2.set_data(x2,y2)
    
    return ln,ln2,
  
ani = FuncAnimation(fig, update, frames=np.linspace(0, 2, 200),
                    init_func=init, blit=True, interval = 10)
plt.show()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-01 20:45:39

由于您正在使用多边形,我建议您使用matplotlib's Polygon而不是一条线来绘制您的形状。这使您可以获得相交形状的坐标,并用您选择的任何颜色绘制相应的多边形:

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt
import shapely.geometry as sg
from matplotlib.animation import FuncAnimation
from matplotlib.patches import Polygon

fig, ax = plt.subplots()

poly1 = Polygon(np.zeros(shape=(0, 2)), facecolor='none', edgecolor='C0')
poly2 = Polygon(np.zeros(shape=(0, 2)), facecolor='none', edgecolor='C1')
intersect = Polygon(np.zeros(shape=(0, 2)), facecolor='C2', edgecolor='none')

ax.add_artist(poly1)
ax.add_artist(poly2)
ax.add_artist(intersect)
t = ax.text(0.5, 0.9, "frame = ", transform=ax.transAxes, ha='center')


def init():
    ax.axis('equal')
    ax.set_xlim(-4, 4)
    ax.set_ylim(-4, 4)
    return poly1, poly2, t


def update(frame):
    t.set_text(f'frame = {frame:.3f}')
    circ1 = sg.Point(frame - 2, 0).buffer(1.0)
    circ2 = sg.Point(-frame + 2, 0).buffer(1.0)

    x, y = circ1.exterior.xy
    x2, y2 = circ2.exterior.xy

    intersection = circ1.intersection(circ2)

    poly1.set_xy(np.c_[x, y])
    poly2.set_xy(np.c_[x2, y2])

    if len(intersection.exterior.coords)>0:
        x3, y3 = intersection.exterior.coords.xy
        intersect.set_xy(np.c_[x3, y3])
        intersect.set_visible(True)
    else:
        intersect.set_visible(False)

    return poly1, poly2, intersect, t


ani = FuncAnimation(fig, update, frames=np.linspace(0, 2, 200),
                    init_func=init, blit=True, interval=10)
plt.show()

票数 4
EN

Stack Overflow用户

发布于 2022-06-07 14:03:06

首先,您需要通过以下方式创建一个fill对象:

代码语言:javascript
复制
fill = ax.fill_between(xdata, ydata, 0, color='cyan')

然后,访问PolyCollection类并在动画函数中更新其顶点。

代码语言:javascript
复制
def animation(t):
    path = fill.get_paths()[0]
    verts = path.vertices
    # change vertice in numpy array hereof
    verts[1:-1, 1][0:2] = np.array([x, x, x])
    fill.set_color('cyan')
    return line
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65533180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档