【发布时间】:2021-04-06 11:48:00
【问题描述】:
假设我有一个数据集,其中包含在不同日期执行相同测试的不同运动员。每天,他们将进行几次试验/运行。我想使用 d3.js 可视化这些天来每位运动员的发展,但我很难理解如何完成这项任务。
在 Python 中使用 seaborn 或在 R 中使用 ggplot2,我会使用 facetplot,其中每一天都是一个方面。在这些方面,我将在 x 轴上进行试验,在 I 轴上进行性能测试。但是如何在 d3.js 中做到这一点?
d3.group and group 允许我按运动员对数据集进行分组,并且我了解如何迭代每个运动员的值。但我不明白如何从这里开始在 d3.js 中实际创建 facetplot。
我曾尝试搜索有关 observable 的相关教程,但运气不佳。一种有趣且相关的可视化是[Trumps Golfs bt Bostock]。另一个is this scatterplot。
有人可以帮助我朝着正确的方向前进吗?我已经创建了一个简单的数据集和散点图,可以作为起始点
const data = d3.range(10).map(i => ({
bib: Math.floor(i / 5) + 1,
ratio: -1 + Math.random() * 5,
run: [1, 2, 3, 4, 5][i % 5],
run: [1, 2, 3, 4, 5][i % 5],
name: ['GIRL1', 'GIRL2', 'GIRL3', 'GIRL4'][Math.floor(i / 5)]
}));
const width = 250;
const height = 150;
const svg = d3.select('svg')
.attr('width', width)
.attr('height', height)
const margin = {
top: 20,
right: 20,
bottom: 20,
left: 50
}
const innerWidth = width - margin.left - margin.right;
const innerHeight = height - margin.top - margin.bottom;
const xScale = d3.scaleLinear()
.domain(d3.extent(data, d => d.run))
.range([0, innerWidth])
const yScale = d3.scaleLinear()
.domain(d3.extent(data, d => d.ratio))
.range([0, innerHeight])
const g = svg.append('g')
.attr('transform', `translate(${margin.left},${margin.top})`)
g.selectAll('circle')
.data(data)
.join('circle')
.attr('r', 3)
.attr('cx', d => xScale(d.run))
.attr('cy', d => yScale(d.ratio))
g.append("g")
.call(d3.axisBottom(xScale))
.attr('transform', `translate(0,${innerHeight})`);;
g.append("g")
.call(d3.axisLeft(yScale))
<script src="https://unpkg.com/d3@6.2.0/dist/d3.min.js"></script>
<svg></svg>
从 R 中绘制示例:
【问题讨论】:
标签: javascript d3.js data-visualization