如何解决d3.js中x轴上的重叠刻度文本

Posted

技术标签:

【中文标题】如何解决d3.js中x轴上的重叠刻度文本【英文标题】:How to solve the overlapping tick texts on xAxis in d3.js 【发布时间】:2022-01-20 04:01:11 【问题描述】:

我正在尝试实现一个折线图,它在 x 轴上有公司,在 Y 轴上有数字。 x 轴(国家)上的刻度值(文本)是重叠的。我已将 scalePoint 刻度用于 x 轴,将 scaleLinear 用于 y 轴。

const svg = d3.select('svg');
svg.style('background-color', 'none');


const width = +svg.attr('width');
const height = +svg.attr('height');

const render = data => 

    const xValue = d => d.FullName;
    const yValue = d => d.TotalCount;

    const margin =  top: 100, right: 70, bottom: 30, left: 100 ;
    const innerWidth = width - margin.left - margin.right;
    const innerHeight = height - margin.top - margin.bottom;

    const xScale = d3.scalePoint()
        .domain(data.map(xValue))
        .range([0, innerWidth]);

    const yScale = d3.scaleLinear()
        .domain([0, d3.max(data, yValue)])
        .range([innerHeight, 0])
        .nice();

    const xAxis = d3.axisBottom(xScale)
        .tickPadding([10])
    const yAxis = d3.axisLeft(yScale)
        .tickPadding([10])
        .tickSize(-innerWidth);

    const g = svg.append('g')
        .attr('transform', `translate($margin.left,$margin.top)`);

    const lineGenerator = d3.line()
        .x(d => xScale(xValue(d)))
        .y(d => yScale(yValue(d)));

    g.append('path')
        .attr('class', 'line-path')
        .attr('d', lineGenerator(data));

    g.selectAll('circle').data(data)
        .enter().append('circle')
        .attr('cx', d => xScale(xValue(d)))
        .attr('cy', d => yScale(yValue(d)))
        .attr('r', 4)
        


    g.append('g').call(yAxis)
        .selectAll('.domain')
        .remove();


    const xAxisG = g.append('g').call(xAxis)
        .attr('transform', `translate(0,$innerHeight)`)


    xAxisG
        .selectAll('.domain,.tick line')
        .remove();
    xAxisG

        g.append('text')
        .attr('class', 'title')
        .attr('y', -20)
        .text('Top 10 Accounts')


d3.csv('Q3-Top Accounts.csv').then(data => 
    data.forEach(d => 
        d.TotalCount = +d.TotalCount;
    );
    render(data);
);

x 轴刻度值不应重叠。刻度文本之间应有空格。请帮我找到解决此问题的方法。

上述代码的结果如下所示

下面是预期的图像。请忽略这些值。只需要帮助安排下图中的刻度文本。谢谢。

【问题讨论】:

【参考方案1】:

也许您可以在 x 轴上将刻度标签旋转 90 度。想旋转标签的可以关注this link。

【讨论】:

感谢canozsoy 的回复。有没有办法在不旋转的情况下在刻度文本之间获得空间? 如果移动刻度标签的位置,它们不会显示错误的数据吗?

以上是关于如何解决d3.js中x轴上的重叠刻度文本的主要内容,如果未能解决你的问题,请参考以下文章

处理 d3.js 轴上的日期

在 D3.js 中创建带有序数刻度的文本标记 x 轴

d3中的多行svg文本轴刻度

解决问题:Python使用seaborn可视化热力图heatmap旋转X轴刻度文本标签45度后发生文本平移重叠问题解决

如何从解析的 d3.js 日期创建新的日期格式

是否可以通过ggrepel避免轴标签重叠?