如何使用电影动画正确引用无花果和斧头

2023-12-01

data_dict = {'x': {(0, 0): 3760.448435678077,
  (0, 12): 4851.68102541007,
  (0, 2226): 5297.61518907981,
  (0, 2479): 4812.134249142693,
  (0, 2724): 4756.5295525777465,
  (0, 3724): 3760.448435678077,
  (0, 4598): 4763.265306122449,
  (0, 4599): 5155.102040816327,
  (0, 4600): 5191.836734693878,
  (1, 0): 3822.238314568112,
  (1, 12): 4856.1910324326145,
  (1, 2226): 5304.678983022428,
  (1, 2479): 4815.435125468252,
  (1, 2724): 4761.889691080804,
  (1, 3724): 3768.2889580569245,
  (1, 4598): 4768.908833716798,
  (1, 4599): 5159.900248610219,
  (1, 4600): 5198.053973405109,
  (2, 0): 3880.710643551325,
  (2, 12): 4860.815600807341,
  (2, 2226): 5311.463202354179,
  (2, 2479): 4818.773880246848,
  (2, 2724): 4767.173347353905,
  (2, 3724): 3775.726731574509,
  (2, 4598): 4774.4490391107765,
  (2, 4599): 5164.871993247027,
  (2, 4600): 5203.992167369707,
  (3, 0): 3936.0658098882136,
  (3, 12): 4865.552525110625,
  (3, 2226): 5317.975399527148,
  (3, 2479): 4822.152977310737,
  (3, 2724): 4772.381182203056,
  (3, 3724): 3782.7732491325282,
  (3, 4598): 4779.888739700325,
  (3, 4599): 5170.010331730589,
  (3, 4600): 5209.661736027094,
  (4, 0): 3988.491290089178,
  (4, 12): 4870.399599918841,
  (4, 2226): 5324.223126993423,
  (4, 2479): 4825.574880492175,
  (4, 2724): 4777.513856434266,
  (4, 3724): 3789.4400036326792,
  (4, 4598): 4785.230752881375,
  (4, 4599): 5175.308321064745,
  (4, 4600): 5215.073098816687,
  (5, 0): 4038.1625164006414,
  (5, 12): 4875.354619808369,
  (5, 2226): 5330.2139372050915,
  (5, 2479): 4829.04205362342,
  (5, 2724): 4782.572030853543,
  (5, 3724): 3795.7384879766646,
  (5, 4598): 4790.477896049872,
  (5, 4599): 5180.7590182533295,
  (5, 4600): 5220.2366751779045,
  (6, 0): 4085.2436834766995,
  (6, 12): 4880.415379355583,
  (6, 2226): 5335.955382614236,
  (6, 2479): 4832.55696053673,
  (6, 2724): 4787.5563662668965,
  (6, 3724): 3801.6801950661807,
  (6, 4598): 4795.632986601749,
  (6, 4599): 5186.355480300186,
  (6, 4600): 5225.16288455017,
  (7, 0): 4129.888499451394,
  (7, 12): 4885.5796731368655,
  (7, 2226): 5341.4550156729465,
  (7, 2479): 4836.122065064363,
  (7, 2724): 4792.4675234803335,
  (7, 3724): 3807.2766178029274,
  (7, 4598): 4800.698841932945,
  (7, 4599): 5192.090764209151,
  (7, 4600): 5229.8621463729005,
  (8, 0): 4172.2408853249335,
  (8, 12): 4890.845295728588,
  (8, 2226): 5346.720388833307,
  (8, 2479): 4839.739831038576,
  (8, 2724): 4797.306163299865,
  (8, 3724): 3812.539249088603,
  (8, 4598): 4805.678279439399,
  (8, 4599): 5197.9579269840615,
  (8, 4600): 5234.344880085516,
  (9, 0): 4212.43562629731,
  (9, 12): 4896.210041707129,
  (9, 2226): 5351.759054547402,
  (9, 2479): 4843.412722291625,
  (9, 2724): 4802.072946531498,
  (9, 3724): 3817.479581824906,
  (9, 4598): 4810.574116517045,
  (9, 4599): 5203.950025628757,
  (9, 4600): 5238.621505127434,
  (10, 0): 4250.598978423163,
  (10, 12): 4901.671705648866,
  (10, 2226): 5356.578565267323,
  (10, 2479): 4847.1432026557695,
  (10, 2724): 4806.7685339812415,
  (10, 3724): 3822.1091089135375,
  (10, 4598): 4815.389170561825,
  (10, 4599): 5210.060117147079,
  (10, 4600): 5242.702440938076,
  (11, 0): 4286.849233720921,
  (11, 12): 4907.228082130176,
  (11, 2226): 5361.186473445152,
  (11, 2479): 4850.933735963267,
  (11, 2724): 4811.393586455103,
  (11, 3724): 3826.4393232561943,
  (11, 4598): 4820.126258969674,
  (11, 4599): 5216.281258542863,
  (11, 4600): 5246.5981069568625,
  (12, 0): 4321.297246645838,
  (12, 12): 4912.876965727434,
  (12, 2226): 5365.590331532978,
  (12, 2479): 4854.786786046375,
  (12, 2724): 4815.948764759092,
  (12, 3724): 3830.481717754576,
  (12, 4598): 4824.788199136532,
  (12, 4599): 5222.606506819949,
  (12, 4600): 5250.318922623211,
  (13, 0): 4354.046924629284,
  (13, 12): 4918.6161510170205,
  (13, 2226): 5369.797691982883,
  (13, 2479): 4858.70481673735,
  (13, 2724): 4820.434729699218,
  (13, 3724): 3834.247785310383,
  (13, 4598): 4829.377808458337,
  (13, 4599): 5229.028918982174,
  (13, 4600): 5253.875307376542,
  (14, 0): 4385.195685194348,
  (14, 12): 4924.443432575308,
  (14, 2226): 5373.816107246958,
  (14, 2479): 4862.690291868448,
  (14, 2724): 4824.852142081489,
  (14, 3724): 3837.7490188253105,
  (14, 4598): 4833.897904331024,
  (14, 4599): 5235.541552033379,
  (14, 4600): 5257.277680656276,
  (15, 0): 4414.834881979362,
  (15, 12): 4930.356604978678,
  (15, 2226): 5377.653129777288,
  (15, 2479): 4866.74567527193,
  (15, 2724): 4829.201662711913,
  (15, 3724): 3840.9969112010617,
  (15, 4598): 4838.351304150532,
  (15, 4599): 5242.137462977402,
  (15, 4600): 5260.53646190183,
  (16, 0): 4443.050201835423,
  (16, 12): 4936.353462803505,
  (16, 2226): 5381.316312025957,
  (16, 2479): 4870.873430780051,
  (16, 2724): 4833.483952396497,
  (16, 3724): 3844.002955339333,
  (16, 4598): 4842.740825312798,
  (16, 4599): 5248.809708818081,
  (16, 4600): 5263.662070552626,
  (17, 0): 4469.92203501027,
  (17, 12): 4942.4318006261665,
  (17, 2226): 5384.813206445053,
  (17, 2479): 4875.07602222507,
  (17, 2724): 4837.699671941253,
  (17, 3724): 3846.7786441418243,
  (17, 4598): 4847.069285213763,
  (17, 4599): 5255.551346559254,
  (17, 4600): 5266.664926048083,
  (18, 0): 4495.525820288381,
  (18, 12): 4948.589413023038,
  (18, 2226): 5388.151365486662,
  (18, 2479): 4879.3559134392435,
  (18, 2724): 4841.849482152186,
  (18, 3724): 3849.3354705102342,
  (18, 4598): 4851.339501249362,
  (18, 4599): 5262.355433204761,
  (18, 4600): 5269.555447827619,
  (19, 0): 4518.893324127626,
  (19, 12): 4954.824094570498,
  (19, 2226): 5391.338341602872,
  (19, 2479): 4883.71556825483,
  (19, 2724): 4845.934043835307,
  (19, 3724): 3851.6849273462612,
  (19, 4598): 4855.554290815534,
  (19, 4599): 5269.21502575844,
  (19, 4600): 5272.344055330656}}

根据上面的数据,我想制作一个动画群图matplotlib and moviepy。然而,通过每帧的以下代码,我得到了额外的点,但保留了旧的点:

import numpy as np
import pandas as pd
from scipy.stats import gaussian_kde
from matplotlib import pyplot as plt
from moviepy.editor import VideoClip
from moviepy.video.io.bindings import mplfig_to_npimage
 
fps = 10
   
df = pd.DataFrame(data_dict)
fig, ax = plt.subplots(1, 1)

def swarm_plot(x):
    kde = gaussian_kde(x)
    density = kde(x)  # estimate the local density at each datapoint
        
    # ax.clear()
    jitter = np.random.rand(*x.shape) - .5
    # scale the jitter by the KDE estimate and add it to the centre x-coordinate
    y = 1 + (density * jitter * 1000 * 2)
    ax.scatter(x, y, s = 30, c = 'g')
    # plt.axis('off')
    return fig
        
def draw_swarmplot(t):
    f = int(t * fps)
    fig, ax = plt.subplots(1, 1)
    dff = df.loc[f]
   
    return mplfig_to_npimage(swarm_plot(dff['x']))
        
anim = VideoClip(lambda x: draw_swarmplot(x), duration=2)
anim.to_videofile('swarmplot.mp4', fps=fps)

结果,所有点都在动画中累积。我相信这是因为matplotlib fig and ax对象使用不当。然而,在draw_swarmplot功能我重置fig and ax每次迭代后的对象。尽管如此,我仍然需要初始化fig and ax在两个函数之外都不会出现错误ax目的。因此,我的问题是两者如何fig and ax应该引用,我缺少什么导致我的代码无法按预期工作?


您的范围fig and ax变量受变量范围 and 跨越界限的部分变量和范围文档。具体相关,

当我们在函数内部使用赋值运算符 (=) 时,它的默认行为是创建一个新的局部变量 - 除非局部作用域中已经定义了同名变量。

请注意,警告“除非已经定义了同名变量“实际上仅限于local变量。正如在example,

a = 0
def my_function():
    a = 3
    print(a)

my_function()
print(a)

这将输出

3
0

这是因为

默认情况下,赋值语句在局部范围内创建变量。所以函数内部的赋值不会修改全局变量[...]

如果要从函数内修改全局变量,请使用关键字global,作为答案@iliar says.

However不建议这样做 -

请注意,从函数内部访问全局变量通常是非常糟糕的做法,修改它们的做法更糟糕。这使得我们很难将我们的程序安排成逻辑上封装的部分,而这些部分不会以意想不到的方式相互影响。如果函数需要访问某些外部值,我们应该将该值作为参数传递给函数。 [...]

两种选择是

  • 将其实现为class
  • Pass fig and ax into draw_swarmplot().

前者

class SwarmPlot:
    def __init__(self):
        self.fig, self.ax = plt.subplots(1, 1)
        anim = VideoClip(lambda x: self.draw_swarmplot(x, self.fig, self.ax), duration=2)
        anim.to_videofile('swarmplot.mp4', fps=fps)

    def swarm_plot(self, x):
        kde = gaussian_kde(x)
        density = kde(x)  # estimate the local density at each datapoint

        jitter = np.random.rand(*x.shape) - .5
        y = 1 + (density * jitter * 1000 * 2)
        self.ax.scatter(x, y, s = 30, c = 'g')
        return self.fig

    def draw_swarmplot(self, t, fig, ax):
        self.fig, self.ax = plt.subplots(1, 1)
        f = int(t * fps)
        dff = df.loc[f]

        return mplfig_to_npimage(self.swarm_plot(dff['x']))

S = SwarmPlot()

后者

def draw_swarmplot(t, fig, ax):
    fig, ax = plt.subplots(1, 1)
    f = int(t * fps)
    dff = df.loc[f]

    return mplfig_to_npimage(swarm_plot(dff['x']))
anim = VideoClip(lambda x: draw_swarmplot(x, fig, ax), duration=2)

对于像这样的简单情况,我可能会偏向后者,但在更复杂的情况下,前者可能更可取。两者似乎都能正确生成所需的输出:

Output

当然,如果你不覆盖的话,这一切都是可以避免的figure and axis通过使用清除函数之一来代替每次迭代中的实例:

  • plt.cla()清除当前轴
  • plt.clf()清除当前数字
  • fig.clear()清除图形fig(相当于plt.clf() if fig是当前的数字)
  • ax.clear()清除轴ax(相当于plt.cla() if ax是个 当前轴)

ax.clear() or plt.cla()在这种情况下可能是最合适的,并且可以按如下方式使用

fig, ax = plt.subplots(1, 1)
def swarm_plot(x):
    kde = gaussian_kde(x)
    density = kde(x)  # estimate the local density at each datapoint

    jitter = np.random.rand(*x.shape) - .5
    y = 1 + (density * jitter * 1000 * 2)
    ax.clear()
    ax.scatter(x, y, s = 30, c = 'g')
    return fig

def draw_swarmplot(t):
    f = int(t * fps)
    dff = df.loc[f]

    return mplfig_to_npimage(swarm_plot(dff['x']))

这也将产生上面所示的输出。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用电影动画正确引用无花果和斧头 的相关文章

随机推荐

  • 在ios swift中将firebase数据添加到数组中

    我在从 firebase 数据库获取数据并将其添加到数组中时遇到问题 该方法的打印输出获取新报价显示数组为空 但屏幕截图显示标签已在获取新报价方法 怎么会发生这种事 事件中是否存在延迟获取新报价导致这种情况的方法 此外 标签是如何随着第四次
  • 在Python中从json中获取多个键

    我的文件中有以下 json 结构 Date timevalue Org b4256282 Referer somevalue Date timevalue Org b4257482 Referer somevalue Date timeva
  • 如何在同一 Play 控制台商店列表中分发 Android 手机+wearOS 项目

    我有一个手机项目 以及一个手表 wearOS 项目 90 的代码在两个项目之间共享 我想将它们打包并分发到同一个商品详情中 注意 所有共享代码都存在于公共库模块中 我尝试将手表项目作为模块添加到我现有的手机项目中 但是在生成要发布的应用程序
  • 如何将 UIPageControl 与 iCarousel 一起使用?

    我在 icarousel 中有一些图像 约20张图片 我想在一页上放 5 张图片 图像像素或图像位置没有问题 如何在没有ScrollView的情况下使用uipagecontrol 例如 能够使用一些委托方法 等等 carousel type
  • Node.js:确定修改时的文件大小

    我正在 Node js 中查看一个文件 并希望在每次更改时获取该文件的大小 如何做到这一点fs watchFile 这就是我目前正在做的事情 fs watchFile file function curr prev determine fi
  • AttributeError:模块“pyparsing”没有属性“downcaseTokens”rasa

    我在使用 rasa 时遇到问题 因为出现以下错误 我无法跑步或训练或做任何事情 回溯 最近一次调用最后一次 文件 c users dell anaconda3 envs rasanew lib runpy py 第 193 行 位于 run
  • 将子控制器添加到表视图单元格时不会调用 viewWillAppear

    当我将子视图控制器添加到表视图单元格时 它看起来像视图将出现对于子视图控制器不被调用 仅查看是否出现 表视图控制器方法 override func tableView tableView UITableView cellForRowAtIn
  • 删除具有相似前缀的重复行

    我需要删除文件中具有重复前缀的类似行并保留唯一的行 由此 abc def ghi abc def ghi jkl one abc def ghi jkl two 123 456 123 456 789 xyz to this abc def
  • 执行动态加载的JS文件

    我理解JS是单线程 同步执行的 因此 当我将文件添加到浏览器头标记时 该文件一遇到就会执行 然后它转到下一个脚本标记并执行该文件 我的问题是当我将 js 文件动态添加到 HTML head 标记时 浏览器如何执行该文件 是不是像当前执行的地
  • 如何用CSS将矩形图像“裁剪”成正方形?

    我知道用 CSS 实际修改图像是不可能的 这就是为什么我将裁剪放在引号中 我想做的是拍摄矩形图像并使用 CSS 使它们显示为正方形而不扭曲图像 我基本上想把这个 进入这个 没有包装器的纯 CSS 解决方案div或其他无用的代码 img ob
  • 在启动时设置默认的 matlab 路径

    我的团队正在尝试标准化我们的 Matlab 路径 以便每个人都有相同的路径 我有一个我们都应该拥有的默认 matlab 路径列表 因此 我们希望有一个在 matlab 打开时运行的脚本 以确保我们的路径设置为默认的 matlab 路径 因此
  • 如何使用 PHP 从 HTML 代码中删除多余的
    标签?

    我正在用 PHP 解析一些凌乱的 HTML 代码 其中有一些冗余标签 我想清理一下它们 例如 br br br br 我如何使用 preg replace 替换类似的东西 br br 换行符 空格以及它们之间的差异 br br and br
  • 无法施展通用套装?

    我今天遇到一个有趣的问题 考虑下面的代码 public static class Parent public static class Child extends Parent Set
  • 如何用 R 中的特定值替换 NA 值?

    我有一个时间序列数据框 但该数据包含 NA 如下所示 KQ11 Open KQ11 High KQ11 Low KQ11 Close KQ11 Volume KQ11 Adjusted 2017 04 05 627 89 630 17 62
  • 使用 AngularFire 中的记录进行基本用户身份验证

    在花了几天时间尝试不同的 各种推荐的方法来做到这一点之后 我找到了我认为最简单和最有希望的方法 也感谢这个问题的好心人 获取 Firebase AngularFire 中项目的索引 ID 当前设置 用户可以使用电子邮件和社交网络登录 因此当
  • turtle.done() 在 Spyder 中不起作用

    这个简单的 Python 脚本 import turtle bob turtle Turtle bob forward 50 turtle done 使用 Spyder 运行时会出现错误 第一次运行按预期工作 但之后 IPython 控制台
  • BadFilterError:过滤器无效:每个查询只能有一个属性具有不等式过滤器(<=、>=、<、>)

    我正在尝试对两个不同的属性应用过滤器 但 GAE 不允许我这样做 那么解决方案是什么 这是代码片段 if searchParentX que filter parentX gt searchParentX filter parentX lt
  • TWIG - 在不同模板中包含变量

    我想在不同的模板中包含相同的变量 vars catchphrase twig set catchphrase size if var tile catchphrase length lt 4 set catchphrase size siz
  • 各种符号(*、&等)与参数组合有什么区别? [复制]

    这个问题在这里已经有答案了 可能的重复 我知道这对你们许多人来说可能是一个非常基本的问题 但尽管我尽了最大的努力 但我确实很难找到一个好的 彻底的解释 我确信答案就在那里 所以我的搜索词一定很糟糕 在 C 中 使用各种符号及其组合来标记参数
  • 如何使用电影动画正确引用无花果和斧头

    data dict x 0 0 3760 448435678077 0 12 4851 68102541007 0 2226 5297 61518907981 0 2479 4812 134249142693 0 2724 4756 529