2012-11-02 32 views
9

Tôi đã thử các cách khác nhau này, nhưng không có gì có vẻ hoạt động. Dưới đây là những gì tôi hiện có:Định dạng thích hợp để vẽ dữ liệu đa giác trong D3

var vis = d3.select("#chart").append("svg") 
     .attr("width", 1000) 
     .attr("height", 667), 

scaleX = d3.scale.linear() 
     .domain([-30,30]) 
     .range([0,600]), 

scaleY = d3.scale.linear() 
     .domain([0,50]) 
     .range([500,0]), 

poly = [{"x":0, "y":25}, 
     {"x":8.5,"y":23.4}, 
     {"x":13.0,"y":21.0}, 
     {"x":19.0,"y":15.5}]; 

vis.selectAll("polygon") 
    .data(poly) 
    .enter() 
    .append("polygon") 
    .attr("points",function(d) { 
     return [scaleX(d.x),scaleY(d.y)].join(",")}) 
    .attr("stroke","black") 
    .attr("stroke-width",2); 

Tôi giả sử các vấn đề ở đây là một trong hai với cách tôi đang xác định các điểm dữ liệu như là một mảng của các đối tượng điểm cá nhân, hoặc một cái gì đó để làm với làm thế nào tôi đang viết hiện chức năng cho .attr("points",...

Tôi đã tìm kiếm trên web để xem hướng dẫn hoặc ví dụ về cách vẽ một đa giác đơn giản, nhưng tôi dường như không thể tìm thấy nó.

Trả lời

19

Một đa giác trông giống như sau: <polygon points="200,10 250,190 160,210" />

Vì vậy, poly mảng đầy đủ của bạn nên tạo ra một chuỗi dài mà sẽ tạo ra một đa giác. Vì chúng ta đang nói về một đa giác nên việc nối dữ liệu cũng phải là một mảng chỉ có một phần tử. Đó là lý do tại sao mã bên dưới hiển thị: data([poly]) nếu bạn muốn có hai đa giác giống hệt nhau, bạn sẽ thay đổi điều này thành data([poly, poly]).

Mục đích là tạo một chuỗi từ mảng của bạn với 4 đối tượng. Tôi sử dụng một mapjoin khác cho việc này:

poly = [{"x":0.0, "y":25.0}, 
     {"x":8.5,"y":23.4}, 
     {"x":13.0,"y":21.0}, 
     {"x":19.0,"y":15.5}]; 

vis.selectAll("polygon") 
    .data([poly]) 
    .enter().append("polygon") 
    .attr("points",function(d) { 
     return d.map(function(d) { 
      return [scaleX(d.x),scaleY(d.y)].join(","); 
     }).join(" "); 
    }) 
    .attr("stroke","black") 
    .attr("stroke-width",2); 

Xem fiddle làm việc: http://jsfiddle.net/4xXQT/

+0

Cảm ơn! Tôi cần phải nghiên cứu nó, nhưng rõ ràng là giải pháp này hoạt động. Bạn có nghĩ đây là cách tốt nhất để làm một đa giác? Nó chỉ tấn công tôi như một chút vụng về để có chức năng đó trong một cấu trúc hàm. Nhưng có lẽ đó là cách nó cần phải được? Tôi đoán câu hỏi của tôi là tôi nên xây dựng các đối tượng dữ liệu theo cách này, hoặc có thể có một cách tốt hơn/sạch hơn để làm điều đó. –

+3

Để cung cấp cho bạn một số ý tưởng khác: Nếu dữ liệu gốc sẽ là một mảng 2D với các vị trí dữ liệu được chia tỷ lệ như [[x1, y1], [x2, y2], [x3, y3]] thì chức năng điểm sẽ đơn giản hơn nhiều : function (d) {return d.join (""); }. Điều này phụ thuộc vào thực tế là ToString mặc định của Javascript cho một mảng là kết hợp chúng với dấu phẩy. Ví dụ: console.log ("" + [0,1,2]); sẽ in "0,1,2". – nautat

+0

Xem fiddle đã sửa đổi minh họa ví dụ này: http://jsfiddle.net/4xXQT/1/ – nautat

0

bạn đang cố vẽ các hình đa giác? - như thế này. http://bl.ocks.org/2271944 Bắt đầu mã của bạn trông giống như một biểu đồ điển hình - thường sẽ kết thúc một cái gì đó như thế này.

chart.selectAll("line") 
    .data(x.ticks(10)) 
    .enter().append("line") 
    .attr("x1", x) 
    .attr("x2", x) 
    .attr("y1", 0) 
    .attr("y2", 120) 
.style("stroke", "#ccc"); 
2

Những câu trả lời trên đều không cần thiết phức tạp.

Tất cả những gì bạn phải làm là chỉ định các điểm dưới dạng chuỗi và mọi thứ hoạt động tốt. Một cái gì đó như thế này dưới đây sẽ làm việc.

var canvas = d3.select("body") 
    .append("svg") 
    .attr("height", 600) 
    .attr("width", 600); 

canvas.append("polygon") 
    .attr("points", "200,10 250,190 160,210") 
    .style("fill", "green") 
    .style("stroke", "black") 
    .style("strokeWidth", "10px"); 
Các vấn đề liên quan