2012-02-29 36 views
13

Tôi sử dụng jquery flot cho biểu đồ hình tròn của mình và tôi gặp sự cố khi chồng chéo các nhãn khi các biểu đồ hình tròn rất nhỏ. Có một giải pháp tốt cho việc đó không?các nhãn chồng lên nhau trong biểu đồ hình tròn flot

Biểu đồ hình tròn của tôi:

series: { 
       pie: { 
        show: true, 
        radius: 1, 
        label: { 
         show: true, 
         radius: 5/8, 
         formatter: function(label, series){ 
          return '<div style="font-size:12pt;text- align:center;padding:2px;color:black;margin-left:-80%;margin- top:-20%;">'+label+'<br/>'+Math.round(series.percent)+'%</div>'; 
         }, 
         background: { opacity: 0.5 } 
        } 
       } 
      }, 
      legend: { 
       show: false 
      } 

Cảm ơn, Arshavski Alexander.

Trả lời

12

Một giải pháp từ các vấn đề mã Google Flot bằng Marshall Leggett (link) :

Tôi nhận thấy rằng có vẻ như phổ biến đối với nhãn bánh để chồng chéo trong các biểu đồ hình tròn nhỏ hơn khiến chúng không thể đọc được, đặc biệt nếu một vài lát có giá trị phần trăm nhỏ là . Đây là với plugin jquery.flot.pie.
Vui lòng xem hình ảnh đính kèm. Tôi đã làm việc xung quanh điều này với việc bổ sung của một thói quen chống va chạm trong mã hiển thị nhãn. Tôi cũng đang đính kèm bản sao của plugin đã sửa đổi. Xem dòng 472-501, đặc biệt là các hàm getPositions() và comparePositions() mới. Phần này dựa một phần vào phát hiện va chạm phần tử DOM của Šime Vidas ' mã. Một cái gì đó như thế này có thể là một bổ sung tốt đẹp cho chiếc bánh thư viện.

pie labels overlapping pie labels overlapping fixed

câu chuyện dài ngắn:

  1. Trong jquery.flot.pie.js và sau dòng có chứa:

    label.css('left', labelLeft);

thêm đoạn mã sau:

// check to make sure that the label doesn't overlap one of the other labels 
var label_pos = getPositions(label); 
for(var j=0; j<labels.length; j++) 
{ 
var tmpPos = getPositions(labels[j]); 
var horizontalMatch = comparePositions(label_pos[0], tmpPos[0]); 
var verticalMatch = comparePositions(label_pos[1], tmpPos[1]);     
var match = horizontalMatch && verticalMatch;       
if(match) 
{ 
    var newTop = tmpPos[1][0] - (label.height() +1); 
    label.css('top', newTop); 
    labelTop = newTop; 
}  
} 

function getPositions(box) { 
     var $box = $(box); 
     var pos = $box.position(); 
     var width = $box.width(); 
     var height = $box.height(); 
     return [ [ pos.left, pos.left + width ], [ pos.top, pos.top + height ] ]; 
} 

function comparePositions(p1, p2) { 
     var x1 = p1[0] < p2[0] ? p1 : p2; 
     var x2 = p1[0] < p2[0] ? p2 : p1; 
     return x1[1] > x2[0] || x1[0] === x2[0] ? true : false; 
} 
labels.push(label); 
  1. Thêm dòng sau vào drawLabels() và bạn đang thực hiện:

    var labels = [];

+0

này là năm 2015 và tôi đang đối mặt với cùng một vấn đề với Flot. Giải pháp của bạn là tốt đẹp nhưng tôi cài đặt lib qua bower. Có vẻ như không phải là một ý tưởng tốt để tinker với nguồn. –

+0

Đây là năm 2017 và hoạt động. Tôi đã để lại một ví dụ trong https://jsfiddle.net/shizus/1j4djqLx/2/ bất kỳ ý tưởng nào tại sao họ không sửa lỗi này một cách chính thức? –

Các vấn đề liên quan