จะทำให้จุดพล็อตของฉันราบรื่นใน d3.js โดยใช้การฉายภาพได้อย่างไร

ฉันสามารถพล็อตข้อมูลสภาพอากาศบางส่วนลงบนแผนที่ได้โดยใช้โค้ดต่อไปนี้ อย่างไรก็ตาม จุดต่างๆ นั้นเป็นสี่เหลี่ยมและฉันอยากให้มันเรียบขึ้น

สี่เหลี่ยมที่ลงจุด,

ฉันต้องการให้พล็อตมันราบรื่นขึ้นเหมือนกับสิ่งที่คล้ายกับ จุดพล็อตในอุดมคติ

ฉันเชื่อว่าฉันต้องดูการประมาณค่า การวิเคราะห์เชิงพื้นที่ และ/หรือแผนที่ Choropleth ฉันคิดว่ามันเป็นอัลกอริธึมที่แตกต่างกันในการทำเช่นนี้ ฉันรู้สึกว่าฉันต้องเติมคะแนนเพิ่มเติมระหว่างจุดที่มีอยู่ใช่ไหม และด้วยเหตุนี้ เป็นไปได้ไหมที่จะสร้างการไล่ระดับสีแบบจุด? สิ่งนี้สามารถทำได้ใน D3 หรือไม่? หรือฉันควรพิจารณาใช้สิ่ง three.js หรือ WebGL

var width = 960,
height = 960;

var map = {};
var projection = d3.geo.mercator()
.scale((width + 1) / 2 / Math.PI)
.translate([width / 2, height / 2])
.precision(.1);

var path = d3.geo.path()
.projection(projection);

var graticule = d3.geo.graticule();

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

svg.append("path")
.datum(graticule)
.attr("class", "graticule")
.attr("d", path);

d3.json("world-50m.json", function(error, world) {
 svg.insert("path", ".graticule")
  .datum(topojson.feature(world, world.objects.land))
  .attr("class", "land")
  .attr("d", path);

svg.insert("path", ".graticule")
  .datum(topojson.mesh(world, world.objects.countries, function(a, b) { return a !== b; }))
  .attr("class", "boundary")
  .attr("d", path);
});

map.plot_points = [];
map.max = 30;
map.min = -1;
var opacity = d3.scale.linear()
 .domain([map.min, map.max])
 .range([0,1]);  
var rainbow = ["#CE0C82", "#800CCE", "#1F0CCE", "#0C5BCE", "#0C99CE", "#2ECE0C", "#BAE806", "#FEFF00", "#FFCD00", "#FF9A00", "#FF6000", "#FF0000"];
zs.forEach(function(zv,zi){
    zv.forEach(function(zzv, zzi){
        if(zzv != 999)
            {
                map.plot_points.push({lat: ys[zi], long:xs[zzi],value:zzv});
            }

        })
});
console.log(map);
var points = svg.selectAll("rects.points")
 .data(map.plot_points)
 .enter()
 .append("rect")
 .attr("class", "points")
 .style("fill", function(d) {
   var scale = d3.scale.linear().domain([map.min, map.max]).range([1, rainbow.length]);
        return rainbow[Math.round(scale(d.value))]; 
}).attr("width", 8)
.attr("height", 8)
.style("fill-opacity", 1)
.attr("transform", function(d) {
        return "translate(" + projection([d.long, d.lat]) + ")";
})

person user176855    schedule 06.12.2013    source แหล่งที่มา


คำตอบ (4)


ดูเหมือนว่าปัญหาในกรณีของคุณคือข้อมูล สิ่งที่คุณต้องทำคือนำข้อมูลต้นฉบับมาแก้ไขให้อยู่ในรูปแบบที่ราบรื่นยิ่งขึ้น สำหรับสิ่งนี้ คุณสามารถใช้โปรแกรม GIS เช่น QGIS วิธีการทำเช่นนั้นขึ้นอยู่กับรูปแบบข้อมูลต้นฉบับของคุณ

เมื่อคุณมีข้อมูลที่ราบรื่นมากขึ้นแล้ว คุณสามารถพล็อตข้อมูลอีกครั้งใน D3 ได้ ฉันเดาว่าผลลัพธ์สุดท้ายจะค่อนข้างคล้ายกับสิ่งที่ฉันทำที่นี่ โดยที่ เส้นชั้นความสูงจะถูกวาดขึ้นเพื่อให้ได้ผลลัพธ์แบบเดียวกับที่คุณต้องการ

person Lars Kotthoff    schedule 06.12.2013
comment
อัลกอริธึมประเภทใดที่ใช้เพื่อทำให้ข้อมูลที่ราบรื่นยิ่งขึ้น? ฉันพยายามทำสิ่งนี้ผ่าน javsacript เท่านั้น conrec นั้นใกล้เคียงที่สุดแต่ใช้ได้เฉพาะกับจุดคู่เท่านั้น - person user176855; 18.12.2013
comment
ฉันไม่รู้อะไรเลยใน Javascript ฉันขอแนะนำให้ใช้โปรแกรม GIS เพื่อสิ่งนั้น - person Lars Kotthoff; 18.12.2013

บางทีคุณอาจลองดู heatmap js

http://www.patrick-wied.at/static/heatmapjs/

แม้ว่าจะอิงตามจุด แต่ก็อาจให้คำแนะนำแก่คุณได้ มันใช้ canvas แทน svg

person Xumo    schedule 06.12.2013

Jason Davies เขียนการนำอัลกอริธึม conrec ไปใช้ซึ่งทำสิ่งที่คุณต้องการ:

https://github.com/jasondavies/conrec.js มีตัวอย่างการทำงานอยู่ข้างใน

person Roger Veciana    schedule 06.12.2013
comment
ฉันคิดว่า conrec.js เป็นวิธีที่จะไปหรือ d3.geo.contour() แต่ฉันจะแปล (ลองจิจูด, ละติจูด, ค่า) หรือ (x, y, ค่า) เป็นบางอย่างสำหรับรูปร่างได้อย่างไร - person user176855; 10.12.2013
comment
ในตัวอย่าง คุณจะเห็นว่าคุณต้องการอาร์เรย์สามอาร์เรย์ โดยมีค่า x, y และค่า: github.com/jasondavies/conrec.js/blob/master/example/ ฉันไม่รู้ว่านี่เป็นคำถามของคุณหรือเปล่า... - person Roger Veciana; 10.12.2013

ฉันเชื่อว่าแถบสีขาวเกิดขึ้นเนื่องจากการฉายภาพที่คุณใช้ ที่จริงแล้ว ความสูงของสี่เหลี่ยมแต่ละรูปควรปรับตามการเคลื่อนตัวไปทางเหนือและใต้จากเส้นศูนย์สูตร เนื่องจากการฉายภาพ Mercator จะเปลี่ยนระยะทางที่ไปทางเหนือและใต้
หากต้องการให้มีความสูงคงที่ของรูปสี่เหลี่ยมผืนผ้า คุณสามารถลองใช้เส้นโครงนี้แทน:< br> http://bl.ocks.org/mbostock/3757119
ซึ่งเก็บรักษา มิติไปทางเหนือและใต้

person tomtomtom    schedule 06.12.2013