const Gradient = ({ data, areaGenerator, height }) => {
const ref = useRef(null);
useEffect(() => {
if (ref.current) {
d3.select(ref.current)
.append('linearGradient')
.attr('id', 'area-gradient')
.attr('gradientUnits', 'userSpaceOnUse')
.attr('x1', 0)
.attr('y1', 0)
.attr('x2', 0)
.attr('y2', height)
.selectAll('stop')
.data([
{ offset: '0%', color: 'rgba(101, 60, 173, 0)' },
{ offset: '100%', color: 'rgba(101, 60, 173, 0.2)' }
])
.enter()
.append('stop')
.attr('offset', d => d.offset)
.attr('stop-color', d => d.color);
d3.select(ref.current).append('path').attr('class', 'area');
}
}, [ ref.current ]);
useEffect(() => {
if (ref.current) {
d3.select(ref.current)
.select('.area')
.datum(data)
.transition()
.duration(1000)
.attr('d', areaGenerator);
}
}, [ ref.current, data ]);
return <g className="gradient-generator" ref={ref} />;
};
x.domain([
d3.min(data, d => new Date(d.date)).setMonth(-1),
d3.max(data, d => new Date(d.date)),
]);
yScale.domain(d3.extent(data, (d) => d.amount))
- так вы повторно задаёте интервал значений, беря в качестве границ минимум (был 0, остался 0) и максимум (вместо ранее установленных 100000 стало 50000, поэтому и "линия достигает самого верха графика") своих данных. .tickFormat(d3.timeFormat('%d %B'))
const data = [
{ title: 'a', value: 0 },
{ title: 'b', value: 100 },
{ title: 'c', value: 200 },
];
d3.select('#svg')
.selectAll('g')
.data(data)
.enter()
.append('g')
.append('rect')
.attr('x', d => d.value)
.attr('y', d => d.value)
.attr('width', 50)
.attr('height', 50)
.attr('fill', '#F0A');
append('div')
должно быть append('xhtml:div')
.