【实战】10分钟完成一个动态信息图

619 阅读7分钟

背景

动态信息图是一种强大的可视化表达方式,它能够将复杂的数据和信息转化为直观、生动的图形化展示。通过动态信息图,我们可以:

  1. 更好地讲述数据故事,让枯燥的数据变得生动有趣
  2. 提升信息传递效率,帮助受众快速理解核心信息
  3. 增强表现力和互动性,提供沉浸式的用户体验
  4. 实现数据的实时更新和动态展示

本文将详细介绍如何使用 VStory 制作一个动态信息图,帮助大家快速上手这个强大的工具。

准备工作

了解VStory

可以先前往 VStory 官网了解一下 VStory ,对其中的基本概念有所了解www.visactor.com/vstory/guid…

Clone 仓库与本地环境

首先,全局安装 @microsoft/rush

npm i --global @microsoft/rush

然后将代码克隆到本地机器:

git clone [git@github.com](mailto:git@github.com):VisActor/VStory.git
cd VStory

也可以选择 Github Desktop

安装依赖

// 注意,在项目根目录执行
rush update

开始 vstory 的本地开发

rush story

成功后使用浏览器打开 http://localhost:6789/ 可以看到如下画面

可以进入 infographic 下查看已经制作完成的信息图

开始制作

确定做什么

可以根据自己感兴趣的领域或者当前的新闻时事选材。信息图是通过含数据的多种可视化内容来进行数据故事讲述的图表。

这里我准备通过图表介绍deepseek发布开源模型后对Ai市场的冲击。并介绍为什么会产生这样的影响。

收集数据

根据目的,我需要收集相关数据:在deepseek发布开源模型后,美股发生了什么变化。

询问 AI 得到相关信息:

  • DeepSeek于2025年1月20日正式发布了其最新开源模型DeepSeek R1。该模型以极低的训练成本(仅约600万美元)实现了与OpenAI o1模型相媲美的性能,并在全球范围内引发轰动

  • 开源模型发布后逐渐火爆,一周后的1月27日(美国当地时间)美股科技板块因DeepSeek的冲击全面暴跌,英伟达股价单日下跌近17%,创下美股历史最大单日市值跌幅纪录,微软、AMD等公司股价也大幅受挫

从财经网站收集1月27日相关的准确数据

公司名称股票代码24日收盘价27日收盘价
英伟达NVDA142.62118.42
博通AVGO244.70202.13
AMDAMD122.84115.01

准备图形内容

数据展示

我这里选择使用图表展示这些数据,询问AI,用什么图表类型可以更好的展示。得到下面的推荐

转存失败,建议直接上传图片文件

现在我去 VChart官网,通过 VChart 绘制这个图表,不需要下载vchart,可以直接在官网提供的在线编辑能力上调试。

先找到并列柱状图的例子(发现在vchart中叫分组柱状图)

然后调整图表的展示效果

  1. 修改图表的数据为我想要展示的数据

  2. 缩小数据范围令数据变化幅度更清晰

  3. 去掉数值轴,单股价格对跌幅比例而言没有太大意义

  4. 添加标注,每支股票的跌幅都标记出来

最终图表效果如下。记录下这个配置 spec 。

3.2 标题与内容介绍

通过 ai 生成符合我想法的标题与文本

**中文标题:**

《DeepSeek重锤AI芯片股:两大巨头单日市值蒸发超17%》

(副标题:从24日到27日,看算法革命如何击穿硬件护城河)


**英文标题:**

DeepSeek's Shockwaves: AI Giants Lose $170B in 72 Hours

(Subtitle: When Algorithms Crack the Silicon Fortress)


**分析文本(中文):**

DeepSeek的技术突破正在改写市场对算力价值的评估体系。三家核心算力供应商的同步暴跌(英伟达-17%/博通-17.4%/AMD-6.4%)揭示了一个残酷现实:AI大模型的效率跃升可能使传统GPU堆叠路线沦为"算力泡沫"。尤其值得警惕的是,英伟达作为万亿市值龙头的断崖式下跌,实际上反映了资本对"算法优化替代硬件升级"技术路径的投票——当训练效率不再依赖芯片数量,整个AI基础设施的投资逻辑正在被颠覆。


**Analysis Text (English):**

DeepSeek's breakthrough exposes a seismic shift in computing economics. The synchronized collapse of chip leaders signals that AI's next phase may bypass brute-force hardware scaling. NVIDIA's historic plunge—its worst performance since the crypto-mining crash—mirrors Wall Street's awakening: when algorithms can achieve 10x training efficiency, the $3 trillion semiconductor industry must reinvent its value proposition. This isn't a correction, but a Copernican revolution in AI infrastructure.

3.4 再来一个背景图

通过 ai 创建一个与内容相关的背景图

设计内容布局与展示效果

让 AI 给出一个基础的布局建议

总结布局效果

  1. 顶部一个大的标题

  2. 副标题在图表正上方

  3. 描述在图表右侧。

考虑到没有更多内容,图表的尺寸和文本内容的大小需要注意,不要给底部过多空白。

开始制作

第一步,新建demo

在项目的这个目录下新建一个你自己的 demo 文件。

packages/vstory/demo/src/demos/infographic

比如这是我新建的文件

然后可以先复制一份其他的信息图内容到你的文件里,删除dsl的内容,它大概长这样

import React, { useEffect } from 'react';
import { IStoryDSL, Player, Story } from '../../../../../vstory-core/src';
import { registerAll } from '../../../../src';

registerAll();
export const DeepseekShockwave = () => {
  const id = 'DeepseekShockwave';
  useEffect(() => {
    const container = document.getElementById(id);
    const canvas = document.createElement('canvas');
    canvas.width = 1024;
    canvas.height = 1024;
    container?.appendChild(canvas);

    const dsl: IStoryDSL = {
      acts: [],
      characters: []
    };

    const story = new Story(dsl, {
      canvas,
      width: 1024, // 我准备做一个 1024 X 700 的长方形信息图
      height: 700,
      scaleX: 'auto',
      scaleY: 'auto'
    });
    const player = new Player(story);
    story.init(player);
    player.play(-1);

    return () => {
      story.release();
    };
  }, []);

  return <div style={{ width: '100%', height: '100%' }} id={id}></div>;
};


添加你的demo到app目录。 app.tsx 在如下位置

然后在 menus 的 Infographic 下添加你的内容,注意先在 app.tsx 里导入你的组件

import { DeepseekShockwave } from './demos/infographic/deepseek-shockwave';

我添加的内容如下

好了,现在你可以在启动调试后的右侧菜单中看到你的 demo 了

添加元素

我们先将需要展示的元素都添加上,随便给它们一个位置。元素添加在character上

背景

首先添加图片资源

注意规则:图片资源必须放到下面这个目录

packages/vstory/demo/src/assest/infographic/${yourDemoName}

然后添加一个图片类型的元素

// 引入图片元素
import bg from '../../assets/infographic/deepseek-shockwave/bg.png';

characters: [
        {
          id: 'background', // 元素 id 后面会用到
          type: 'Image', // 类型
          zIndex: 0,  // 层级
          position: { // 元素的位置大小
            x: 0,
            y: 0,
            width: 1024,
            height: 700
          },
          options: {
            graphic: {
              image: bg, 
              fillOpacity: 0.4 // 透明度
            }
          }
        },
]

图表

// 引入图片元素
import bg from '../../assets/infographic/deepseek-shockwave/bg.png';

characters: [
    // ... others
    {
      id: 'chart',
      type: 'VChart',
      zIndex: 1,
      position: { //先随便给一位置吧
        x: 50,
        y: 50,
        width: 400, // 注意要给宽高
        height: 400
      },
      options: {
        spec: spec // 之前内容准备时的图表配置
      }
    }
]

文本

// 引入图片元素
import bg from '../../assets/infographic/deepseek-shockwave/bg.png';

characters: [
    // ... others
    {
      id: 'title',
      type: 'Text',
      zIndex: 1,
      position: { x: 512, y: 0, width: 1024, height: 100 },
      options: {
        graphic: {
          text: `DeepSeek's shockwave: AI's technological revolution`,
          fill: 'black',
          fontSize: 48,
          textAlign: 'center',
          fontWeight: 'bolder'
        }
      }
    },
]

全部元素添加完之后。

给它们配置一个展示动作。(动画我们最后再配置)

const dsl: IStoryDSL = {
  acts: [
    {
      id: 'defaultAct',
      scenes: [
        {
          id: 'defaultScene',
          actions: [
            {
            // 给所有元素都先给一展示动作,不设置具体动画属性的话,它们会直接展示
              characterId: ['background', 'title', 'subTitle', 'desc1', 'desc2', 'chart'],
              characterActions: [
                {
                  action: 'appear'
                }
              ]
            }
          ]
        }
      }
    ]
    ...character
}

你应该可以看到一个凌乱的信息图

布局与微调

现在我们需要调整元素到它对应的位置,调整属性让它看起来协调一些

  • 可以通过 character 的 position 属性来调整元素位置与大小

  • 文本的 text 属性可以数组,这样你可以通过下面的形式进行手动换行

 text: [`When Algorithms Crack`, '\n', `the Silicon Fortress`], 

简单的调整位置,文本颜色与大小之后现在这个信息图已经快要完成了

艺术再加工

这一部分仁者见仁智者见智,比如可以添加图形,水印,给文字添加背景等等。

添加动画

刚刚我们在添加元素时,在action里添加了一个统一的 appear 动作。现在我们给元素单独配置不同的动画效果

以右侧文本为例:

const dsl: IStoryDSL = {
  acts: [
    {
      id: 'defaultAct',
      scenes: [
        {
          id: 'defaultScene',
          actions: [
            {
              characterId: ['desc1'],
              characterActions: [
                {
                  action: 'appear',
                  startTime: 1000, // 开始动画的时间
                  payload: [
                    {
                      animation: {
                        duration: 800, // 持续时间
                        easing: 'linear', // 差值方法
                        effect: 'wipe' // 效果
                      }
                    }
                  ]
                }
              ]
            }
           // ... other actions
           ]
         }
       }
     ]
   }
   // ... characters 

具体动画配置文档在这里 www.visactor.com/vstory/guid…

最终效果

上传

  1. 从 develop 拉新分支,提交 pr 的 target 也是 develop。

  2. 提交pr时,选择 demo update 并邀请 Reviewers :xuefei1313 or neuqzxy or xiaoluoHe

参考 pr

如何提交pr

欢迎交流

转存失败,建议直接上传图片文件

Discord:discord.gg/3wPyxVyH6m

微信公众号:打开链接扫码

Twiter:twitter.com/xuanhun1