4

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

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

首先,它是数据......我在 Excel 中有省份的数据:

省 10 年 100 1000 10000
1970 年 2 4 6 3
1971 年 3 6 8 5
B 1970 6 9 12 6
乙 1971 4 8 11 8
………… . . .

对于每个省和年份,我希望能够绘制一张面积图:

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. 时间滑块

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

普罗托维斯问题:

  1. 如何格式化此应用程序的数据(省、年、x、y)?
  2. 如何实现复选框与区域的绑定?
  3. 如何实现时间滑块?在 Protovis 中还是像带有触发重新渲染图形的侦听器的外部组件一样?
4

2 回答 2

6

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

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

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

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,使用 jQuery UI 作为滑块——来创建你的界面元素。每个元素的 onchange 函数只需要设置相应的全局变量并调用vis.render()(假设你的根面板被调用vis)。这应该很简单 - 请参阅此处的 Protovis 示例,使用 jQuery UI 制作与您的想法非常相似的时间滑块。

于 2011-02-01T06:59:19.910 回答
0

我认为您正在尝试制作那对图表:

http://mbostock.github.io/protovis/ex/zoom.html

于 2014-08-04T09:33:54.433 回答