基于Svelte实现可视化辞典
前言
之前做数据可视化的时候,学习过英国金融时报(Financial Times)的可视化辞典(Visual Vocabulary),遗憾的是中文版的只有PDF没有网页。另外,从网上也查到了基于Tableau实现的可视化辞典,但是体验了一下,感觉有些卡顿。所以,就干脆自己写一个好了。刚好最近了解了一下Svelte,所以就用Svelete实现了中文版的可视化辞典。
设计思路
我自己本身并不懂UI,只能是一通瞎整:在布局上参考了Tableau的可视化辞典,在色彩风格上以FT Times原版的Visual Vocabulary为基础。之所以这么做也有投机取巧之处:
- FT Times的布局、动画是使用D3.js实现的,我要一模一样就免不了要手撸D3.js;
- Tableau的图表是基于自身实现的,而实际上我直接使用FT Times原版的SVG就够了。
技术上,一个静态页面而已。前端框架用的Svelte.js, 样式使用的是Bulma CSS。
组件开发
参考Tableau的实现方式,通过不同标签页的切换显示不同类型的可视化图表。主要基于两个组件实现:
- Panel组件,用来管理各个标签页;
- TabContent组件,用来管理各个标签页下的内容。
Panel组件
组件代码如下:
1 | <script lang="ts"> |
说明:
- 采用Svelte的
each
语法生成标签页的头; - 使用
scrollTabs
实现标签的横向滚动; - 使用
position:sticky
的样式,保证当纵向内容过长时,标签始终位于顶部可见; - 使用Bulma的
tabs
和is-active
控制标签的切换; - 通过
activeItem
保存激活的标签页信息,并传递相关数据。
TabContent组件
虽然名字叫"TabContent",但其实整个页面中只有一个TabContent
的实例,叫"PanelContent"可能更贴切一些,不过由于它的内容是靠标签控制的,所以还是叫"TabConent"吧。
代码如下:
1 | <script lang="ts"> |
说明:
Tab
组件的属性包括description
和units
两个,前者用来显示本页的摘要内容,units
则用来显示具体的条目;- 出于省事儿的目的,我为Vocabulary和其他的图表标签使用了相同的组件,但是两者要显示的内容其实并不完全一样,所以使用Svelte的
if
语法控制显示不同的内容; - 对于
units
,使用Svelte的if
语法控制渲染,使用Bulma的message
来控制样式。
数据
除了做好组件以外,还需要提供数据,FT Times已经提供了中文的PDF版本,我把需要的内容抠出来保存成一个JSON数组,保存在data.js
中,基本的代码类似:
1 | export const vocabularies = [ |
矢量图
矢量图基本来自英文版的项目,不过发现有些矢量图似乎有问题,所以进行了相应的修改。
效果
简单些,直接看图:
有兴趣的读者可以看网页:
https://zen-tea.space/visual-vocabulary-cn/
小结
简单总结一下我这个版本的好处:
- 提供了FT Visual Vocabulary的中文网页版;
- 修正了原有Visual Vocabulary中一些图表的显示问题;
- 比Tableau更加流畅。