如何将对象传递给单独的函数-Python

强子

我的目标是使用下面的df制作散点图的动画。我正在尝试将plotandgroups函数传递给该animate函数。我试图从每个函数返回值,然后将它们传递给后续函数,但NameError由于没有注册这些值,因此我得到了

如果我删除plotgroups函数,并从全局工作区传递对象以进行动画处理,则脚本可以工作,但是我必须一直将它们写出来。而不是将其置于单独的功能中。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl
from matplotlib import animation

df1 = pd.DataFrame({
    'Time' : [1,1,1,2,2,2,3,3,3],        
    'GroupA_X' : [3, 4, 5, 2, 5, 6, 1, 6, 7], 
    'GroupA_Y' : [2, 4, 5, 2, 5, 5, 2, 6, 5],            
    'GroupB_X' : [2, 5, 3, 2, 4, 2, 2, 3, 1],   
    'GroupB_Y' : [2, 4, 3, 3, 3, 4, 4, 2, 5],                 
        })

def plot():

    fig, ax = plt.subplots()
    ax.grid(False)

    xy = 0,0
    Oval = mpl.patches.Ellipse(xy, 160, 130, lw = 2, edgecolor = 'black', color = 'blue', alpha = 0.2)
    ax.add_patch(Oval)

    return fig, ax

def groups():

    plot()

    Group_A = df1[['Time','GroupA_X','GroupA_Y']]
    Group_B = df1[['Time','GroupB_X','GroupB_Y']]

    GA_X = np.array(Group_A.groupby(['Time'])['GroupA_X'].apply(list))
    GA_Y = np.array(Group_A.groupby(['Time'])['GroupA_Y'].apply(list))

    GB_X = np.array(Group_B.groupby(['Time'])['GroupB_X'].apply(list))
    GB_Y = np.array(Group_B.groupby(['Time'])['GroupB_Y'].apply(list))

    GA = ax.scatter(GA_X[0], GA_Y[0], c = ['blue'], marker = 'o', s = 10, edgecolor = 'black')
    GB = ax.scatter(GB_X[0], GB_Y[0], c = ['brown'], marker = 'o', s = 10, edgecolor = 'black')

    return GA, GB

def animate(i) :

    plot()
    groups()

    GA.set_offsets(np.c_[GA_X[0+i], GA_Y[0+i]])
    GB.set_offsets(np.c_[GB_X[0+i], GB_Y[0+i]])

plot()
groups()

ani = animation.FuncAnimation(fig, animate, np.arange(0,3), interval = 1000, blit = False)

错误输出:

GA = ax.scatter(GA_X[0], GA_Y[0], c = ['blue'], marker = 'o', s = 10, edgecolor = 'black')
NameError: name 'ax' is not defined
安迪(Andy L.)

动画在global上绘制/重复figure,因此您需要subplots在global范围内创建如果您定义subplots内部plot函数,则每次调用plot都会创建一个新的subplots

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl
from matplotlib import animation

df1 = pd.DataFrame({
    'Time' : [1,1,1,2,2,2,3,3,3],        
    'GroupA_X' : [3, 4, 5, 2, 5, 16, 21, 36, 47], 
    'GroupA_Y' : [2, 4, 5, 2, 5, 15, 22, 36, 45],            
    'GroupB_X' : [2, 5, 3, 2, 4, 12, 22, 33, 41],   
    'GroupB_Y' : [2, 4, 3, 3, 3, 14, 24, 32, 45],                 
        })

fig, ax = plt.subplots()

def plot():

#     fig, ax = plt.subplots() #declared in global scope
    ax.grid(False)

    xy = 0,0
    Oval = mpl.patches.Ellipse(xy, 160, 130, lw = 2, edgecolor = 'black', color = 'blue', alpha = 0.2)
    ax.add_patch(Oval)

#     return fig, ax #no need return since `fig, ax` are in global scope

def groups():

#   plot() #no need since this function use nothing from `plot`

    Group_A = df1[['Time','GroupA_X','GroupA_Y']]
    Group_B = df1[['Time','GroupB_X','GroupB_Y']]

    GA_X = np.array(Group_A.groupby(['Time'])['GroupA_X'].apply(list))
    GA_Y = np.array(Group_A.groupby(['Time'])['GroupA_Y'].apply(list))

    GB_X = np.array(Group_B.groupby(['Time'])['GroupB_X'].apply(list))
    GB_Y = np.array(Group_B.groupby(['Time'])['GroupB_Y'].apply(list))

    GA = ax.scatter(GA_X[0], GA_Y[0], c = ['blue'], marker = 'o', s = 10, edgecolor = 'black')
    GB = ax.scatter(GB_X[0], GB_Y[0], c = ['brown'], marker = 'o', s = 10, edgecolor = 'black')

    return GA, GB, GA_X, GA_Y, GB_X, GB_Y

def animate(i) :

#     plot()
    GA, GB, GA_X, GA_Y, GB_X, GB_Y = groups()

    GA.set_offsets(np.c_[GA_X[0+i], GA_Y[0+i]])
    GB.set_offsets(np.c_[GB_X[0+i], GB_Y[0+i]])

plot() 
# groups()

ani = animation.FuncAnimation(fig, animate, np.arange(0,3), interval = 1000, blit = False)

注意:我更改了值,df1以使每个动画之间的值都更清晰。修复以上工作的代码。我测试了 但是,我不知道它是否有效。我基本上只是修复您的代码以使其运行。

您说如果在全局范围内声明所有内容,动画运行就很好。因此,我假设您的系统已经ffmpeg安装并且您的代码能够调用/查找ffmpeg.exe以显示重新定义/循环动画

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Python将对象传递给对象

来自分类Dev

如何将python对象传递给需要指针类型的函数

来自分类Dev

如何将对象传递给CasperJS函数

来自分类Dev

如何将对象传递给 std::accumulate 函数?

来自分类Dev

如何将变量数组/对象传递给python(Google App Engine)

来自分类Dev

如何将变量数组/对象传递给python(Google App Engine)

来自分类Dev

将Python函数作为对象传递给Spark

来自分类Dev

将Python函数作为对象传递给Spark

来自分类Dev

从 python 如何将在 sys.settrace 回调中接收到的帧对象传递给采用 void * 的 C++ 函数

来自分类Dev

如何将python自我对象传递给另一个python脚本

来自分类Dev

将对象方法传递给python中的外部函数

来自分类Dev

将对象方法传递给python中的外部函数

来自分类Dev

如何将对象传递给函数并将结果返回给原始函数

来自分类Dev

将Java对象传递给python

来自分类Dev

如何将对象传递给脚本?

来自分类Dev

如何将对象传递给react-redux

来自分类Dev

如何将对象传递给车把帮手

来自分类Dev

如何将对象传递给脚本?

来自分类Dev

jQuery如何将对象传递给另一个函数

来自分类Dev

如何将对象传递给rxjs subscription()回调函数?

来自分类Dev

如何将对象传递给TypeScript中的泛型函数

来自分类Dev

如何将对象传递给rxjs subscription()回调函数?

来自分类Dev

如何通过引用将对象传递给构造函数

来自分类Dev

c ++:将对象传递给函数

来自分类Dev

将对象传递给PowerShell函数

来自分类Dev

将对象传递给函数方法

来自分类Dev

如何将std :: bind对象传递给函数

来自分类Dev

如何将json对象传递给$ eval函数

来自分类Dev

您如何正确地将字节对象传递给Python中的新线程?

Related 相关文章

热门标签

归档