javascript - 如何根据数据集中的特定属性对 dc.graph.js 节点颜色进行排序?
问题描述
我想使用 dc.graph.js 可视化数据集,并且我想让节点根据数据文件中特定属性的不同值显示不同的颜色。这是我想可视化的示例 json 数据集:
"nodes": [
{
"id": 0,
"name": "beans",
"fiber content":"high"
},
{
"id": 1,
"name": "meat",
"fiber content":"low"
},
{
"id": 2,
"name": "apple",
"fiber content":"high"
},
{
"id": 3,
"name": "walnut",
"fiber content":"medium"
},
{
"id": 4,
"name": "egg",
"fiber content":"low"
};
我希望所有纤维含量高的食物在图表上都具有相同的颜色,而纤维含量中等的食物显示另一种颜色,而纤维含量低的食物则显示第三种颜色。换句话说,我希望基本上把节点分成三组:高、中、低纤维含量,然后分别给每组分配颜色。我通读了 dc.graph.js API,发现 nodeKey 是节点属性的唯一标识符,所以我查看了演示 js,发现这个函数可以导入数据文件并定义属性项:
function on_load(filename, error, data) {
var graph_data = dc_graph.munge_graph(data),
nodes = graph_data.nodes,
edges = graph_data.edges,
sourceattr = graph_data.sourceattr,
targetattr = graph_data.targetattr,
nodekeyattr = graph_data.nodekeyattr;
var edge_key = function(d) {
return d[sourceattr] + '-' + d[targetattr] + (d.par ? ':' + d.par : '');
};
var edge_flat = dc_graph.flat_group.make(edges, edge_key),
node_flat = dc_graph.flat_group.make(nodes, function(d) { return d[nodekeyattr]; }),
cluster_flat = dc_graph.flat_group.make(data.clusters || [], function(d) { return d.key; });
我不确定它如何识别导入数据集中的属性,所以我想知道是否需要指出并链接到代码中某处的“纤维含量”属性,以告诉它我的颜色组是基于什么的。对于颜色设置,刷亮过滤演示实际上在图形上具有颜色,但图形是在没有数据集的情况下随机自动生成的,因此没有围绕所涉及的属性进行任何分组。我尝试将以下有关颜色的代码片段(我主要从 Brushing-filtering.js 遵循)添加到上面相同的 on_load 函数,但它不起作用:
var colorDimension = node_flat.crossfilter.dimension(function(n) {
return n.color;
}),
colorGroup = colorDimension.group(),
dashDimension = edge_flat.crossfilter.dimension(function(e) {
return e.dash;
}),
dashGroup = dashDimension.group();
var colors = ['#1b9e77', '#d95f02', '#7570b3'];
var dasheses = [
{name: 'solid', ray: null},
{name: 'dash', ray: [5,5]},
{name: 'dot', ray: [1,5]},
{name: 'dot-dash', ray: [15,10,5,10]}
];
Diagram
.autoZoom('once-noanim')
.altKeyZoom(true)
.nodeFixed(function(n) { return n.value.fixed; })
.nodeLabelFill(function(n) {
var rgb = d3.rgb(Diagram.nodeFillScale()(Diagram.nodeFill()(n))),
// https://www.w3.org/TR/AERT#color-contrast
brightness = (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;
return brightness > 127 ? 'black' : 'ghostwhite';
})
.nodeFill(function(kv) {
return kv.value.color;
})
.nodeFillScale(d3.scale.ordinal().domain([0,1,2]).range(colors))
关于如何实现这一点的任何提示?
解决方案
推荐阅读
- image - 从不以 .jpeg 结尾的 URL 下载图像
- string - 如何将字符串列表拆分为列表中的字符串列表?
- c - 阶乘函数只数到 12
- git - 将提交移动到 Visual Studio 中的不同分支?
- reactjs - 寻找如何使用 React i18n 的确认
- regex - 仅在具有特定前缀的文件中搜索 IntelliJ 中的文本
- azure-devops - 发出会话令牌时出错:HostAuthorizationNotFound
- django - Django Rest Framework 分页和过滤
- ansible - 如果标准输出结果等于失败,如何使用 Ansible 重新启动服务器?
- filesystems - MTDBLOCK1 似乎被嵌入式 Linux 系统上的 SD 卡内容覆盖