乱世老高 发表于 2024-3-23 16:34:10

manim动图输出

我需要你为我的水资源缺水量分配规则绘制一个动图来解释其分配原理,使用python来实现:
首先我将概化二维中的缺水量为一维柱状图,这里可以用随机生成的整型数(均大于0)来作为缺水量,绘制这里的柱状图,柱状图为横坐标代表他们生成时候的顺序,纵坐标为缺水量。
接着按照缺水量从大到小排序,绘制此时的柱状图。
接着,实现分配水量操作,我将给出一个具体的值用以代表可分配水量,分配过程中实行差异优先,分层配水的原则。该原则的实现如同绘制一条线的移动过程,这条线从柱状图的最大柱开始向下移动,线条上方的住所代表的数值(倘若一个柱数值为76,线宽为1,那么高度就为76)等于我给出的数值时,线条停止移动。移动过程中,线下放的柱子被设置为红色,随着线的移动,线上放的柱子变为绿色,然后绘制最后停止是的画面。
上述的所有过程,整合为一个manim动图输出出来

FishC 发表于 2024-3-23 16:34:26

好的,我会使用manim库来制作动图,下面是实现的代码:

from manim import *
import random

class WaterDistribution(Scene):
    def construct(self):
      # 生成随机的缺水量
      water_shortage =
      
      # 绘制初始柱状图
      bars = self.draw_bars(water_shortage)
      self.play(Write(bars))
      self.wait()
      
      # 按缺水量排序
      sorted_water_shortage = sorted(water_shortage, reverse=True)
      
      # 排序后的柱状图
      sorted_bars = self.draw_bars(sorted_water_shortage)
      self.play(Transform(bars, sorted_bars))
      self.wait()

      # 移动线条并标记柱子颜色
      allocation_value = 50# 可分配水量
      line = Line(start=UP * 5, end=DOWN * 5)
      self.play(ShowCreation(line))
      for i, bar in enumerate(sorted_bars):
            if sorted_water_shortage <= allocation_value:
                bar.set_color(GREEN)
            else:
                bar.set_color(RED)
            self.wait(0.5)
      self.wait()
      
    def draw_bars(self, heights):
      bars = VGroup()
      for i, height in enumerate(heights):
            bar = Rectangle(height=height, width=0.5, fill_opacity=1).next_to(bars, RIGHT, buff=0.2)
            bars.add(bar)
      return bars

使用manim执行上述代码,会生成一个动图,依次展示缺水量的随机生成,排序后的柱状图以及线条的移动过程。

请确保已经安装manim库,并且参考manim库的文档来执行代码:https://docs.manim.community/

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

乱世老高 发表于 2024-3-23 16:35:43

FishC 发表于 2024-3-23 16:34
好的,我会使用manim库来制作动图,下面是实现的代码:




代码没有写完,请告诉我具体的过程,以及输出的代码

FishC 发表于 2024-3-23 16:36:04

乱世老高 发表于 2024-03-23 16:35
代码没有写完,请告诉我具体的过程,以及输出的代码

抱歉,代码被截断了。下面是完整的代码以及输出的过程:

from manim import *
import random

class WaterDistribution(Scene):
    def construct(self):
      # 生成随机的缺水量
      water_shortage =

      # 绘制初始柱状图
      bars = self.draw_bars(water_shortage)
      self.play(Write(bars))
      self.wait()

      # 按缺水量排序
      sorted_water_shortage = sorted(water_shortage, reverse=True)

      # 排序后的柱状图
      sorted_bars = self.draw_bars(sorted_water_shortage)
      self.play(Transform(bars, sorted_bars))
      self.wait()

      # 移动线条并标记柱子颜色
      allocation_value = 50# 可分配水量
      line = Line(start=UP * 5, end=DOWN * 5)
      self.play(ShowCreation(line))
      for i, bar in enumerate(sorted_bars):
            if sorted_water_shortage <= allocation_value:
                bar.set_color(GREEN)
            else:
                bar.set_color(RED)
            self.play(ApplyMethod(line.move_to, bar.get_bottom()))
            self.wait(0.5)

      self.wait()

    def draw_bars(self, heights):
      bars = VGroup()# 所有柱子的集合
      for i, height in enumerate(heights):
            bar = Rectangle(height=height, width=0.8)
            bar.move_to(LEFT * (len(heights)/2 - i))
            bars.add(bar)
      return bars

scene = WaterDistribution()
scene.render()

这段代码使用manim库来制作动图。首先,我们生成了10个随机的缺水量。然后,绘制了初始的柱状图,并按照缺水量从大到小排序。接下来,我们创建了一条线并将其移动到柱子的底部,同时标记柱子的颜色。移动过程中,如果柱子的缺水量小于等于可分配水量(50),则将其标记为绿色,否则标记为红色。最后,输出生成的动图。

您可以安装manim库并执行以上代码,即可生成相应的动图。请注意,manim库的安装和使用可能需要一些额外的配置,请根据您的操作系统和Python环境进行相应的设置。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: manim动图输出