假设我有一个数据集,其中包含不同运动员在不同的测试日进行的测试。每天,他们会进行几次试验/运行。我想使用d3.js可视化每个运动员在这些日子里的发展情况,但是我不知道如何完成这项任务。
在Python中使用seaborn或在R中使用ggplot2,我会使用一个facetplot,其中每一天都是一个facet。在这些facets中,我会将试验放在x轴上,将表现放在I轴上。但是我该如何在d3.js中实现这一点呢? d3.group和group允许我按运动员对数据集进行分组,并且我了解如何遍历每个运动员的值。但我不知道如何从这里开始实际创建一个facetplot。
我已经尝试在observable上搜索相关的教程,但没有什么好运气。一个有趣且相关的可视化是[Trumps Golfs bt Bostock]。另一个是这个scatterplot。
在Python中使用seaborn或在R中使用ggplot2,我会使用一个facetplot,其中每一天都是一个facet。在这些facets中,我会将试验放在x轴上,将表现放在I轴上。但是我该如何在d3.js中实现这一点呢? d3.group和group允许我按运动员对数据集进行分组,并且我了解如何遍历每个运动员的值。但我不知道如何从这里开始实际创建一个facetplot。
我已经尝试在observable上搜索相关的教程,但没有什么好运气。一个有趣且相关的可视化是[Trumps Golfs bt Bostock]。另一个是这个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中的示例绘图: