图表生成
本教程将向你详细介绍VMind中的图表智能生成功能,并提供一些示例。
生成图表的方式有很多,比如你可以在PowerBI、Tableau等专业的BI可视化工具中,利用数据集的字段来制作可视化图表;或者你也可以直接使用VChart、ECharts、MatPlotlib等图表库,通过编写代码来绘制图表。此外,VChart、Echarts等图表库还提供了简单易用的图表编辑器,用户可以上传数据并进行图表制作。
然而,传统的图表 生成方式也存在一些问题:
- 对于编程新手来说,他们可能不会编写代码,也就无法使用图表库来生成图表。
- 图表类型繁多,用户展示数据的目的各不相同,这就导致了适合展示的图表类型和对应的字段映射也会有所不同。对于非专业用户来说,他们可能无法准确地选择出最能表达自己观点的图表类型。

- 用户对于图表样式、动画的需求各不相同,往往需要一定的设计能力才能满足。设计出令人眼前一亮的图表并不容易,它需要设计技能和审美意识,而这些是许多用户所缺乏的。
这些问题增加了数据可视化的创作门槛,阻碍了非专业用户创作符合自己意图的可视化作品。
VMind的解决方案是,利用大语言模型的自然语言理解能力和公域知识,根据用户的数据和展示意图,推荐合适的图表类型,并将字段映射到合适的视觉通道上,实现图表的智能生成,从而降低用户进行数据可视化的门槛。
generateChart
VMind的generateChart函数是一个强大的工具,它可以帮助你智能生成图表。这个函数需要以下几个参数:
-
userPrompt (string): 用户的可视化意图(你想用图表展示什么信息)
-
fieldInfo (Array): 数据集中字段的信息,包括字段名称,类型等
-
dataset (Array): 图表中使用的原始数据集,可以是undefined。若dataset为undefined,则会生成一个spec模板,后续可以调用fillSpecTemplateWithData将数据填充到spec模板。
-
options: 可选,选项参数,包括以下内容:
- chartTypeList (ChartType[],可选): 支持的图表类型列表。若不为undefined,则会从该列表指定的图表类型中选择生成。
- enableDataQuery (boolean, 可选): 决定是否在图表生成过程中开启数据聚合
- colorPalette (Array
, 可选): 用于设置图表的调色板 - animationDuration (number, 可选): 用于设置图表动画的播放持续时间
- theme (ChartTheme | string, 可选): 设置最终sepc的主题样式,默认为空,VMind会默认使用带渐变颜色的主题样式,可以设置 VChart 通用深浅主题('light' | 'dark')或者符合你使用场景下的主题样式
这个方法会返回一个VChart图表spec。
📢 请注意:generateChart方法会将userPrompt和fieldInfo传递给大语言模型用于生成图表,但是dataset中的详细数据并不会被传递。
在生成图表的过程中,VMind首先会利用大语言模型,根据userPrompt和fieldInfo,推荐一个适合的图表类型。然后,它会将fieldInfo中的字段映射到图表的x轴、y轴、颜色、尺寸等视觉通道上。
VMind默认会为生成的图表添加入 场动画,因此它还会返回图表动画的时长time。如果你不想要图表动画,可以将spec.animation设为false。
你可以在VChart动画教程中了解更多关于图表动画的信息。
下面是一个使用generateChart生成图表的例子:
import VMind from '@visactor/vmind'; const vmind = new VMind(options) const userPrompt = 'show me the changes in sales rankings of various car brand'; const { spec, time } = await vmind.generateChart(userPrompt, fieldInfo, dataset);
你可以在创建VMind实例中了解如何创建VMind实例和options中的参数信息,在数据格式与数据处理章节中获取更多关于fieldInfo和dataset的相关信息。
你可以对spec进行二次加工,改变图表的颜色、样式、动画等配置,也可以直接渲染VChart图表:
<body> <!-- Prepare a DOM with size (width and height) for vchart, of course you can also specify it in the spec configuration --> <div id="chart" style="width: 600px;height:400px;"></div> </body>
import VChart from '@visactor/vchart'; // Create vchart instance const vchart = new VChart(spec, { dom: 'chart' }); // Render Chart vchart.renderSync();
在userPrompt中,你可以描述你想展示的内容,这将作为大语言模型推荐图表类型时的依据;你也可以通过options.colorPalette传入一个颜色字符串数组,它将被用作图表的颜色主题。
参数详解
userPrompt
userPrompt参数是你用来描述你想要用数据集展示的内容,这个描述会被传递给大语言模型,作为生成图表时的参考依据。
举个例子,假设我们有一个手机品牌销售数据集,如下所示:
[ { "品牌名称": "Apple", "市场份额": 0.5, "平均价格": 7068, "净利润": 314531 }, { "品牌名称": "Samsung", "市场份额": 0.2, "平均价格": 6059, "净利润": 362345 }, { "品牌名称": "Vivo", "市场份额": 0.05, "平均价格": 3406, "净利润": 234512 }, { "品牌名称": "Nokia", "市场份额": 0.01, "平均价格": 1064, "净利润": -1345 }, { "品牌名称": "Xiaomi", "市场份额": 0.1, "平均价格": 4087, "净利润": 131345 } ]
你可以将userPrompt设置为展示各品牌市场占有率,然后调用generateChart方法,这样就会生成一个饼图:

你也可以设置userPrompt为展示各品牌的净利润,这样生成的图表就会展示各品牌的净利润情况:

你还可以指定图表类型,比如设置userPrompt为展示各品牌的净利润,用折线图,这样生成的图表就会是一个折线图:

你甚至可以指定图表视觉通道的映射,例如设置userPrompt为使用平均价格做x轴,净利润做y轴,品牌名称用作颜色,市场份额做点的大小,绘制散点图:

VMind的强大之处在于,你只需要用一句话描述你的需求,就可以生成你想要的图表,而无需关心图表生成的细节。这得益于大语言模型所掌握的公域知识。
例如,对于下面这份csv数据:
时间,男-早餐,女-早餐 周一,15,22 周二,12,10 周三,15,20 周四,10,12 周五,13,15 周六,10,15 周日,12,14
如果你输入的展示意图为展示男女早餐饭量不同,那么就会生成一个双轴图:

VMind还支持动态条形图(ranking bar),这是一种叙事图表,它通过不断变化的柱状图展示不同时间节点不同种类的数据在排名上的变化。为了生成一个动态条形图,数据中必须有一个时间字段。
例如,我们有下面的数据集和字段信息:
[ { "country": "USA", "continent": "North America", "GDP": 239270, "year": 1973 }, { "country": "India", "continent": "Asia", "GDP": 22960, "year": 1973 }, { "country": "South Korea", "continent": "Asia", "GDP": 7870, "year": 1973 }, { "country": "Indonesia", "continent": "Asia", "GDP": 10980, "year": 1973 }, { "country": "Saudi Arabia", "continent": "Asia", "GDP": 23760, "year": 1973 }, { "country": "Thailand", "continent": "Asia", "GDP": 4130, "year": 1973 }, { "country": "Philippines", "continent": "Asia", "GDP": 5660, "year": 1974 }, { "country": "Malaysia", "continent": "Asia", "GDP": 2780, "year": 1974 }, { "country": "United Kingdom", "continent": "Europe", "GDP": 114750, "year": 1974, } ...... //完整数据集请见VMind仓库中的packages/vmind/__tests__/browser/src/constants/mockData.ts文件 ]
[ { "fieldName": "country", "type": "string", "role": "dimension" }, { "fieldName": "continent", "type": "string", "role": "dimension" }, { "fieldName": "GDP", "type": "float", "role": "measure" }, { "fieldName": "year", "type": "date", "role": "measure" } ]
如果userPrompt为Show me the change of the GDP rankings of each country,那么就会生成一个动态条形图:

为了让VMind生成符合预期的图表,你需要在userPrompt中尽可能清晰地描述你的展示意图和目的。此外,你还需要确保数据集的字段名称具有一定的语义,或者在字段信息中添加字段描述,具体请参见数据格式与数据处理章节。
User Prompt 为空
如果我有一个图表,在不进行人工意图的输入下,即没有userPrompt的输入情况下,我可以得到一个较好的图表生成结果吗?
答案是,yes!
目前 VMind 支持在没有用户意图的情况下,根据公域知识以及字段的信息内容,去产生一个用户最可能想要在这个数据上进行呈现的图表内容。同样与前文,这需要数据中的数据信息和字段信息尽可能的详细和完整,设想如果我的数据每个字段的名称和描述都为'a' | 'b' | 'c'这样的内容,显然无法产生一个高质量的图表,这个数据本身也没有特别的意义,因为我们并不了解其中的字段到底代表了什么含义。
同样以前文的手机品牌销售额数据集作为测试,当我们不传入userPrompt时,结果如下所示
