d3 autospace overlapping tick labels

前端 未结 3 829
轻奢々
轻奢々 2021-02-14 10:19

Is there a way in d3 to not draw overlapping tick labels? For example, if I have a bar chart, but the bars are only 5 pixels wide and the labels are 10 pixels wide, I end up wit

3条回答
  •  悲哀的现实
    2021-02-14 11:03

    I've had a similar problem with multiple (sub-)axis, where the last tick overlaps my vertical axis in some situations (depending on the screen width), so I've just wrote a little function that compares the position of the end of the text label with the position of the next axis. This code is very specific to my use case, but could adapted easily to your needs:

    var $svg = $('#svg');
    
    // get the last tick of each of my sub-axis
    $('.tick-axis').find('.tick:last-of-type').each(function() {
    
      // get position of the end of this text field
      var endOfTextField = $(this).offset().left + $(this).find('text').width();
    
      // get the next vertical axis
      var $nextAxis = $('line[data-axis="' + $(this).closest('.tick-axis').attr('data-axis') + '"]');
    
      // there is no axis on the very right, so just use the svg width
      var positionOfAxis = ($nextAxis.length > 0) ? $nextAxis.offset().left : $svg.offset().left + $svg.width();
    
      // hide the ugly ones!
      if (endOfTextField > positionOfAxis) {
        $(this).attr('class', 'tick hide');
      }
    
    });
    

    The ticks with color: aqua are the hidden ones:

提交回复
热议问题