var width = 960,
height = 550
var svg = d3.select("body").append("svg")
.attr("width", width)
.attr("height", height)
function col_x(i){
return i*200+100;
}
var axis_g=svg.append("g");
for(var i=0;i<4;i++){
axis_g.append("line")
.attr("class", "axis")
.attr("x1", col_x(i))
.attr("x2", col_x(i))
.attr("y1",10)
.attr("y2",490);
}
var control_g=svg.append("g");
var label_g=svg.append("g");
var color = d3.scale.category10();
var linear = d3.scale.linear().range([10, 490]);
var tip = d3.tip()
.attr('class', 'd3-tip')
.offset([-10, 0])
.html(function(d) {
return "Sepal Length: " + d["Sepal Length"] + "
Sepal Width: "+ d["Sepal Width"] + "Petal Length: "+ d["Petal Length"] + "Petal Width: "+ d["Petal Width"] + "";
})
var data_c=svg.append("g");
svg.call(tip);
d3.select(self.frameElement).style("height", "800px");
d3.csv("IrisData.txt", function(error, data) {
if (error) throw error;
var domainByTrait = {},
traits = d3.keys(data[0]).filter(function(d) { return d !== "Class"; }),
n = traits.length;
function highlight(c){
data_c.selectAll("g").filter(function(d){return d["Class"]==c;}).attr("class","highlight");
}
function back(c){
data_c.selectAll("g").filter(function(d){return d["Class"]==c;}).attr("class","link");
}
function choose(c){
data_c.selectAll("g").filter(function(d){return d["Petal Length"]>c.Petal_Length_min && d["Petal Length"]<=c.Petal_Length_max && d["Petal Width"]>c.Petal_Width_min && d["Petal Width"]<=c.Petal_Width_max;}).attr("class","highlight");
}
function unchoose(c){
data_c.selectAll("g").filter(function(d){return d["Petal Length"]>c.Petal_Length_min && d["Petal Length"]<=c.Petal_Length_max && d["Petal Width"]>c.Petal_Width_min && d["Petal Width"]<=c.Petal_Width_max;}).attr("class","link");
}
var classes = d3.scale.ordinal().domain(data.map(function(d){return d["Class"];})).domain();
control_g.selectAll("g")
.data(classes)
.enter()
.append("text")
.attr("class","label")
.attr("x",800)
.attr("y",function(d,i){return 50+50*i;})
.attr("fill",function(d){return color(d);})
.text(function(d){return d;})
.on("mouseover",highlight)
.on("mouseout",back);
var jsonCircles = [
{ "x_axis": 850, "y_axis": 230, "radius": 10, "Petal_Length_min" : 0,"Petal_Length_max" : 7, "Petal_Width_min" : 0, "Petal_Width_max" : 3 ,"color":"white"},
{ "x_axis": 800, "y_axis": 280, "radius": 10, "Petal_Length_min" : 0,"Petal_Length_max" : 1.9, "Petal_Width_min" : 0, "Petal_Width_max" : 3,"color":"blue"},
{ "x_axis": 900, "y_axis": 280, "radius": 10, "Petal_Length_min" : 1.9,"Petal_Length_max" : 7, "Petal_Width_min" : 0, "Petal_Width_max" : 3,"color":"white"},
{ "x_axis": 850, "y_axis": 330, "radius": 10, "Petal_Length_min" : 1.9,"Petal_Length_max" : 7, "Petal_Width_min" : 0, "Petal_Width_max" : 1.7,"color":"white"},
{ "x_axis": 950, "y_axis": 330, "radius": 10, "Petal_Length_min" : 1.9,"Petal_Length_max" : 7, "Petal_Width_min" : 1.7, "Petal_Width_max" : 3,"color":"green"},
{ "x_axis": 800, "y_axis": 380, "radius": 10, "Petal_Length_min" : 1.9,"Petal_Length_max" : 4.9, "Petal_Width_min" : 0, "Petal_Width_max" : 1.7,"color":"orange"},
{ "x_axis": 900, "y_axis": 380, "radius": 10, "Petal_Length_min" : 4.9,"Petal_Length_max" : 7, "Petal_Width_min" : 0, "Petal_Width_max" : 1.7,"color":"green"},];
var circles=control_g.selectAll("circle").data(jsonCircles).enter().append("circle");
var circleAttributes = circles
.attr("cx", function (d) { return d.x_axis; })
.attr("cy", function (d) { return d.y_axis; })
.attr("r", function (d) { return d.radius; })
.attr("fill", function (d) { return d.color; })
.attr("stroke", "black")
.on("mouseover", choose)
.on("mouseout", unchoose)
;
label_g.append("text").attr("fill","black").attr("x",750).attr("y",190).text("Decision Tree:")
label_g.append("text").attr("fill","black").attr("x",750).attr("y",30).text("Class:")
label_g.append("text").attr("fill","black").attr("x",815).attr("y",215).attr("font-size","6px").text("Petal Length");
label_g.append("text").attr("fill","black").attr("x",805).attr("y",245).attr("font-size","6px").text("<=1.9");
label_g.append("text").attr("fill","black").attr("x",870).attr("y",245).attr("font-size","6px").text(">1.9");
label_g.append("text").attr("fill","black").attr("x",865).attr("y",265).attr("font-size","6px").text("Petal Width");
label_g.append("text").attr("fill","black").attr("x",855).attr("y",300).attr("font-size","6px").text("<=1.7");
label_g.append("text").attr("fill","black").attr("x",920).attr("y",300).attr("font-size","6px").text(">1.7");
label_g.append("text").attr("fill","black").attr("x",815).attr("y",315).attr("font-size","6px").text("Petal Length");
label_g.append("text").attr("fill","black").attr("x",805).attr("y",350).attr("font-size","6px").text("<=4.9");
label_g.append("text").attr("fill","black").attr("x",870).attr("y",350).attr("font-size","6px").text(">4.9");
control_g.append("line").attr("class","axis").attr("x1",855).attr("x2",890).attr("y1",235).attr("y2",275);
control_g.append("line").attr("class","axis").attr("x1",845).attr("x2",805).attr("y1",235).attr("y2",275);
control_g.append("line").attr("class","axis").attr("x1",905).attr("x2",945).attr("y1",285).attr("y2",325);
control_g.append("line").attr("class","axis").attr("x1",895).attr("x2",855).attr("y1",285).attr("y2",325);
control_g.append("line").attr("class","axis").attr("x1",855).attr("x2",895).attr("y1",335).attr("y2",375);
control_g.append("line").attr("class","axis").attr("x1",845).attr("x2",805).attr("y1",335).attr("y2",375);
traits.forEach(function(trait,i) {
domainByTrait[trait] = d3.extent(data,function(d){return d[trait];});
linear.domain(domainByTrait[trait]);
axis_g.append("text")
.attr("x",col_x(i)-30)
.attr("y",520)
.text(trait);
var ticks=axis_g.append("g")
.attr("class","ticks");
var lowest=parseFloat(domainByTrait[trait][0]),
highest=parseFloat(domainByTrait[trait][1]),
step=parseFloat(((highest-lowest)/4).toFixed(2));
var t=d3.range(lowest,(highest+step),step);
console.log(t);
ticks.selectAll("text")
.data(t)
.enter()
.append("text")
.attr("x",col_x(i)-30)
.attr("y",function(d){return 500-linear(d.toFixed(1))+5;})
.text(function(d){return d.toFixed(1);});
data_c.selectAll("g")
.data(data)
.enter()
.append("circle")
.attr("cx",col_x(i))
.attr("cy",function(d){ return 500-linear(d[trait]);})
.attr("r", 3)
.style("fill", function(d) { return color(d["Class"]); });
});
data_c.selectAll("g")
.data(data)
.enter()
.append("g")
.attr("class","link");
for(var i=0;i<3;i++){
data_c.selectAll("g")
.append("line")
.attr("y1",function(d){linear.domain(domainByTrait[traits[i]]);return 500-linear(d[traits[i]]);})
.attr("y2",function(d){linear.domain(domainByTrait[traits[i+1]]);return 500-linear(d[traits[i+1]]);})
.attr("x1",col_x(i))
.attr("x2",col_x(i+1))
.style("stroke",function(d){return color(d["Class"]);})
.on("mouseover",tip.show)
.on("mouseout",tip.hide);
}
});