d3.js - D3 按条件填充线性图的区域
问题描述
我有一个数据集
[
{
date: '2015-12',
value: 100,
priority: null,
},
{
date: '2016-01',
value: 200,
priority: 'high',
},
{
date: '2016-02',
value: 200,
priority: null,
},
{
date: '2016-03',
value: 200,
priority: null,
},
{
date: '2016-04',
value: 100,
priority: 'low',
},
{
date: '2016-05',
value: 250,
priority: 'low',
},
{
date: '2016-06',
value: 250,
priority: null,
},
{
date: '2016-07',
value: 100,
priority: null,
},
{
date: '2016-08',
value: 250,
priority: null,
}
]
我用 D3 v4 创建了线性图表。priority
现在我必须按字段值从上到下用背景颜色填充图表的段吗?像在图像上(高优先级段应该用红色填充,低 - 用绿色等)有人可以举例说明如何实现这种行为,或者建议研究方向吗?
解决方案
您可以创建一个带刻度,用于计算两个日期之间每个刻度的宽度,如下所示:
const bandScale = d3.scaleBand()
.domain(data.map(item => item.date).slice(1))
.range([margin.left, width - margin.right])
.paddingInner(0)
之后,您可以在添加路径之前使用 rect 元素添加新的迭代器:
svg.selectAll('rect')
.data(data)
.enter()
.append('rect')
.attr('fill', d => d.priority !== null ?
d.priority === 'high' ? '#FFBBB7' : '#CCFFC4' :
'transparent')
.attr('x', d => x(new Date(d.date)))
.attr('y', margin.top)
.attr('width', bandScale.bandwidth())
.attr('height', height - margin.top - margin.bottom)
您将在 x 轴上为刻度添加一个矩形,其中填充取决于优先级。
请参阅以下 observable:https ://observablehq.com/@cstefanache/simple-line-chart
推荐阅读
- spring - 如何在春季应用程序启动时从资源目录加载所有.yml文件?
- c - C:返回行中的 OR 运算符?
- php - 如何让 xdebug 在远程服务器上的 Docker 中工作
- powershell - PSobject 作为变量
- angular - 全局 .replace Angular6
- r - 带条件面板的闪亮模块中的命名空间错误
- android - 使用 linphone 获取 Asterisk HangupCauseCode?
- python - 为什么 Python pandas read_csv 与其他函数结合使用时不起作用
- dynamic - 动态构建 lambda 表达式
- scala - Scala Array 是 Sequence 的子类型