gpt4 book ai didi

javascript - 使用 Protovis 的交互式面积图

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:28:39 27 4
gpt4 key购买 nike

对于 Protovis 新手来说,这是一个相当艰巨的项目,但也许你可以帮我把它分成易于消化的 block ?

我想要构建的是一个“交互式面积图”,如下所示:http://i.stack.imgur.com/7bs9W.png

首先是数据...我在 Excel 中有各省的数据:

Province   Year  10  100  1000  10000 A          1970  2   4    6     3 A          1971  3   6    8     5 B          1970  6   9    12    6 B          1971  4   8    11    8 ....       ...   .   .    .     .

For each province and year, I would like to be able to draw an area chart:

vis.add(pv.Area) 
.data(data.ProvinceA[1970])
.bottom(1)
.interpolate("basis")
.left(function(d) x(d.x))
.height(function(d) y(d.y))
.fillStyle("rgb(21,173,210)")
.anchor("top").add(pv.Line)
.lineWidth(3);

然后我想添加两种类型的交互:

  1. 省份选择
  2. 时间 slider

选择复选框和时间 slider 共同决定在任何给定时间哪些区域可见。例如,如果选择省 A 且年份为 1984 年,则仅显示该地区。如果现在拖动时间 slider ,则现在会显示省 A 的相应年份。如果选中另一个省,则会覆盖这些区域,并在时间 slider 移动时重新绘制两个区域。

Protovis 问题:

  1. 如何为该应用程序设置数据格式(省、年、x、y)?
  2. 如何实现复选框与区域的绑定(bind)?
  3. 如何实现时间 slider ?在 Protovis 中还是像带有触发重新渲染图形的监听器的外部组件?

最佳答案

格式化数据:第一步是使用一些外部工具将其转化为 JSON(我真的很喜欢 Google Refine,尽管它是一个非常大的工具,如果这就是您所需要的 - 试试 Mr. Data Converter一个快速而肮脏的选择)。这些工具可能会将数据作为 JSON 对象提供给您,如下所示:

`[{"Province":"A", "Year":"1970", "10":2, "100":4, "1000":6, "10000":3}, ...]`

一旦您获得了 JSON 格式的数据,您就会希望将其调整为您的可视化。您将要向每个 pv.Area 传递一个值数组 - 从您的描述来看,您似乎想要 [10, 100, 1000, 10000] 值。 Protovis 有很多用于操作数据的工具 - 请参阅 pv.Nest operator .有很多方法可以解决这个问题 - 我可能会这样做:

data = pv.nest(data)
.key(function(x) {return x.Province})
.key(function(x) {return x.Year})
.rollup(function(v) {
return [v[0]['10'], v[0]['100'], v[0]['1000'], v[0]['10000']];
});

它给你一个像这样的对象:

{ 
A: {
1970: [2,4,6,3]
// ...
},
// ...
}

这将为您设置界面元素。将选中的省份数组和当前年份保存在全局变量中:

var currentProvinces = ['A', 'B', ...];
var currentYear = 1970;

并设置您的区域以引用这些变量:

// a containing panel to help with layout and data
var panel = vis.add(pv.Panel)
.data(function() currentProvinces); // making this a function allows it to
// be re-evaluated later
// the area itself
var area = panel.add(pv.Area)
.data(function(province) data[province][currentYear]);
// plus more area settings as needed

现在使用一些其他库——我偏爱 jQuery, slider 使用 jQuery UI——来创建你的界面元素。每个元素的 onchange 函数只需要设置相应的全局变量并调用 vis.render()(假设您的根面板名为 vis)。这应该很简单 - 请参阅 here对于使用 jQuery UI 制作与您的想法非常相似的时间 slider 的 Protovis 示例。

关于javascript - 使用 Protovis 的交互式面积图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4773393/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com