Skip to content

Instantly share code, notes, and snippets.

@cheesinglee
Forked from ashenfad/README.md
Created June 13, 2016 18:04
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save cheesinglee/54854777e25e2a5c47577f4d4d1929f8 to your computer and use it in GitHub Desktop.
Dynamic Scatterplot - Iris

Dynamic scatterplot of the iris dataset.

Controls:

  • Left click to choose X-axis.
  • Right click to choose Y-axis.
  • Alt + right click to choose color axis.
  • Repeat click (left, right, or alt) for log scale.
  • Hover over a point to see all field values.
  • Click a multi-point (larger circle) to cycle through values.
  • Drag box to zoom in.
  • Click on empty area to zoom out.
  • Choose plot granularity with keys 1-9 (1 is the default).
</script>
<!DOCTYPE html>
<meta charset="utf-8">
<style>
.domain {
stroke: #ddd;
stoke-width: 1px;
fill: none;
}
.tick line {
stroke: #ddd;
stroke-dasharray: 3,3;
}
.field {
cursor: pointer;
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
-ms-user-select: none;
user-select: none;
}
.brush .extent {
stroke: #fff;
fill-opacity: .125;
shape-rendering: crispEdges;
}
svg {
-webkit-user-select: none; /* webkit (safari, chrome) browsers */
-moz-user-select: none; /* mozilla browsers */
-khtml-user-select: none; /* webkit (konqueror) browsers */
-ms-user-select: none; /* IE10+ */
}
.field-marker {
}
</style>
<body oncontextmenu="return false;">
<script src="http://d3js.org/d3.v3.min.js"></script>
<script>
function getParam(key) {
if(key=(new RegExp('[?&]'+encodeURIComponent(key)+'=([^&]*)'))
.exec(location.search))
return decodeURIComponent(key[1]);
}
function setParam(key, value) {
key = encodeURI(key); value = encodeURI(value);
var s = document.location.search;
var kvp = key+"="+value;
var r = new RegExp("(&|\\?)"+key+"=[^\&]*");
s = s.replace(r,"$1"+kvp);
if(!RegExp.$1) {s += (s.length>0 ? '&' : '?') + kvp;};
window.history.replaceState({}, "", s);
}
function removeParam(key) {
var sourceURL = document.location.search;
var rtn = sourceURL.split("?")[0],
param,
params_arr = [],
queryString = (sourceURL.indexOf("?") !== -1) ? sourceURL.split("?")[1] : "";
if (queryString !== "") {
params_arr = queryString.split("&");
for (var i = params_arr.length - 1; i >= 0; i -= 1) {
param = params_arr[i].split("=")[0];
if (param === key) {
params_arr.splice(i, 1);
}
}
rtn = rtn + "?" + params_arr.join("&");
}
window.history.replaceState({}, "", rtn);
}
var margin = {top: 20, right: 20, bottom: 20, left: 20},
width = 1000 - margin.left - margin.right,
height = 640 - margin.bottom - margin.top;
var svg = d3.select("body").append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
var defs = d3.select("svg").append("defs");
d3.json("iris.json", function(error, data) {
var fields = data.fields;
var rows = data.rows;
var shows;
var buffer = width / 20;
var field_size = width / 4;
var right_fields = 250;
var plotWidth = width - 2 * buffer - right_fields;
var plotHeight = 0.75 * height;
resetConstraints();
function resetConstraints() {
for (var i = 0; i < fields.length; i++) {
fields[i].constraint = false;
}
shows = [];
for (var i = 0; i < rows.length; i++) {
shows.push(true);
}
evalConstraints();
}
function evalConstraints() {
var visiblePoints = 0;
for (var i = 0; i < rows.length; i++) {
var show = true;
for (var j = 0; j < fields.length && show; j++) {
var field = fields[j];
if (field.constraint) {
var val = rows[i][j];
if ((field.optype == "numeric" &&
(val < field.minConstraint || val > field.maxConstraint)) ||
(field.optype == "categorical" && !(val in field.catConstraint))) {
show = false;
}
}
}
if (show) visiblePoints += 1;
shows[i] = show;
}
if (visiblePoints == 0) {
resetConstraints();
} else {
r = Math.pow((6 * Math.min(plotWidth, plotHeight)) / Math.min(visiblePoints, 1024), 0.5);
}
}
var brushX = d3.scale.identity().domain([buffer, plotWidth]),
brushY = d3.scale.identity().domain([0, plotHeight]);
var brushExtent;
var brush = d3.svg.brush()
.x(brushX)
.y(brushY)
.on("brush", brushed)
.on("brushend", brushended);
svg.append("g")
.attr("class", "brush")
.call(brush)
.call(brush.event);
function brushed() {
brushExtent = brush.extent();
}
function brushended() {
var validConstraint = true;
if (!d3.event.sourceEvent) return; // only transition after input
if (fields[x].optype == "numeric") {
fields[x].minConstraint = xScale.invert(brushExtent[0][0]);
fields[x].maxConstraint = xScale.invert(brushExtent[1][0]);
} else {
var cats = fields[x].cats;
var selected = {};
for (var i = 0; i < cats.length; i++) {
var val = xScale(cats[i]);
if (val >= brushExtent[0][0] && val <= brushExtent[1][0]) {
selected[cats[i]] = true;
}
}
fields[x].catConstraint = selected;
}
if (fields[y].optype == "numeric") {
fields[y].minConstraint = yScale.invert(brushExtent[1][1]);
fields[y].maxConstraint = yScale.invert(brushExtent[0][1]);
} else {
var cats = fields[y].cats;
var selected = {};
for (var i = 0; i < cats.length; i++) {
var val = yScale(cats[i]);
if (val >= brushExtent[0][1] && val <= brushExtent[1][1]) {
selected[cats[i]] = true;
}
}
if (selected.length == 0) {
validConstraint = false;
}
fields[y].catConstraint = selected;
}
d3.select(this).call(brush.extent([[0, 0], [0, 0]]));
if (validConstraint) {
fields[x].constraint = true;
fields[y].constraint = true;
evalConstraints();
updateForClick();
} else {
fields[x].constraint = false;
fields[y].constraint = false;
}
}
var maxNameChars = 0;
for (var i = 0; i < fields.length; i++) {
maxNameChars = Math.max(maxNameChars, fields[i].name.length);
}
var valueOffset = 9 * maxNameChars;
for (var i = 0; i < fields.length; i++) {
fields[i].constraint = false;
makeField(fields[i], i);
calcRange(i);
}
var hintY = i * 28;
var hintX = width - right_fields - buffer;
hint = svg.append("g").attr("class", "hint").style("font-size","12px");
hint.append("text")
.attr("transform", "translate(" + hintX + "," + (hintY + 20) + ")")
.text("Left click --> Set X Axis");
hint.append("text")
.attr("transform", "translate(" + hintX + "," + (hintY + 35) + ")")
.text("Right click --> Set Y Axis");
hint.append("text")
.attr("transform", "translate(" + hintX + "," + (hintY + 50) + ")")
.text("Alt + left click --> Set Color");
var fcX = width - right_fields - buffer + valueOffset;
var fcY = -5;
svg.append("g").attr("class", "field-counter").append("text")
.attr("transform", "translate(" + fcX + "," + fcY + ")");
var gx, gy;
var xAxis, yAxis;
var xScale;
var yScale;
var uniqueMap;
var xMap;
var yMap;
var colorMap;
var colorFn;
var currentRow = null;
var currentIds;
var x = getParam("x");
var y = getParam("y");
var c = getParam("c");
if (x == null) x = 2;
if (y == null) y = 3;
if (c == null) c = fields.length - 1;
setParam("x", x);
setParam("y", y);
setParam("c", c);
var xLogMode = getParam("xLog");
var yLogMode = getParam("yLog");
var cLogMode = getParam("cLog");
if (xLogMode == null) xLogMode = false;
if (yLogMode == null) yLogMode = false;
if (cLogMode == null) cLogMode = false;
var granularity = getParam("g");
if (granularity == null) granularity = 1;
var pointIndex = 0;
var r;
makeAxis();
makePoints();
updateForClick();
function genKey(row) {
var xVal, yVal;
var g = 1 + ((granularity - 1) * 5);
if (fields[x].optype == "numeric") {
xVal = Math.round(xScale(row[x]) / g) * g;
} else {
xVal = row[x];
}
if (fields[y].optype == "numeric") {
yVal = Math.round(yScale(row[y]) / g) * g;
} else {
yVal = row[y];
}
return xVal.toString() + "," + yVal.toString();
}
d3.select("body").on("keydown", keydown);
function keydown() {
var needUpdate = true;
var lastKeyDown = d3.event.keyCode;
if (lastKeyDown >= 49 && lastKeyDown <= 57) {
granularity = lastKeyDown - 48;
if (granularity == 1) {
removeParam("g");
} else {
setParam("g", granularity);
}
updateForClick();
}
}
function updateForClick() {
updateScales();
updateUniqueMap();
updateColorFn();
updatePoints();
updateFieldMarkers();
updateAxis();
}
function makeField(field, index) {
var x_loc = width - right_fields - buffer;
var y_loc = 20 + index * 28;
var field_text = svg.append("g")
.attr("class", "field");
field_text.append("text")
.attr("class", "field")
.attr("transform", "translate(" + x_loc + "," + y_loc + ")")
.on("click", function() {
if (d3.event.altKey) {
if (c == index && fields[c].optype == "numeric") {
cLogMode = !cLogMode;
} else {
cLogMode = false;
}
if (cLogMode == true) {
setParam("cLog", true);
} else {
removeParam("cLog");
}
c = index;
setParam("c", index);
} else {
if (x == index && fields[x].optype == "numeric") {
xLogMode = !xLogMode;
} else {
xLogMode = false;
}
if (xLogMode == true) {
setParam("xLog", true);
} else {
removeParam("xLog");
}
x = index;
setParam("x", index);
}
updateForClick();
})
.on("contextmenu", function() {
if (y == index && fields[y].optype == "numeric") {
yLogMode = !yLogMode;
} else {
yLogMode = false;
}
if (yLogMode == true) {
setParam("yLog", true);
} else {
removeParam("yLog");
}
y = index;
setParam("y", index);
updateForClick();
})
.text(field.name);
svg.append("g")
.append("text")
.attr("class", "field-value")
.attr("transform", "translate(" + (valueOffset + x_loc) + "," + y_loc + ")");
svg.append("g")
.append("text")
.attr("class", "field-marker")
.attr("transform", "translate(" + (-6 + x_loc) + "," + y_loc + ")")
.style("text-anchor", "end")
.text("");
}
function makeAxis() {
gy = svg.append("g")
.attr("class", "y-axis")
.attr("transform", "translate(" + buffer + "," + 0 + ")");
gx = svg.append("g")
.attr("class", "x-axis")
.attr("transform", "translate(" + 0 + "," + plotHeight + ")");
}
function updateAxis() {
var currentY = gy.transition()
.duration(700)
.call(yAxis);
if (fields[y].optype == "categorical") {
currentY.selectAll("text")
.attr("y", 10)
.attr("x", 2)
.style("fill", "#999")
.style("font-size", "13")
.style("text-anchor", "start");
}
var currentX = gx.transition()
.duration(700)
.call(xAxis);
if (fields[x].optype == "categorical") { // && fields[x].cats.length > 4) {
currentX.selectAll("text")
.attr("y", 5)
.attr("x", 2)
.attr("transform", "rotate(-90)")
.style("fill", "#999")
.style("font-size", "13")
.style("text-anchor", "start");
}
}
function updateFieldMarkers() {
var ids = Array.apply(null, Array(fields.length)).map(function (_, i) {return i;});
svg.selectAll(".field-marker")
.data(ids)
.text(function(d) {
var marker = "";
if (d == x) {
if (xLogMode) {
marker += "x";
} else {
marker += "X";
}
}
if (d == y) {
if (yLogMode) {
marker += "y";
} else {
marker += "Y";
}
}
if (d == c) {
if (cLogMode) {
marker += "c";
} else {
marker += "C";
}
}
if (marker != "") { marker += ":"};
return marker;
})
}
function updateFieldValues() {
var ids = Array.apply(null, Array(fields.length)).map(function (_, i) {return i;});
var currentRow;
if (currentIds != null) {
currentRow = rows[currentIds[pointIndex % currentIds.length]];
}
svg.selectAll(".field-value")
.data(ids)
.text(function(d) {
var val = "";
if (currentRow != null) {
val += currentRow[d].toString();
}
return val;
});
svg.select(".field-counter").select("text")
.text(function(d) {
var str = "";
if (currentIds != null && currentIds.length > 1) {
str += (1 + pointIndex % currentIds.length) + " of " + currentIds.length;
}
return str;
});
}
function updateUniqueMap() {
uniqueMap = {};
for (var i = 0; i < rows.length; i++) {
if (shows[i]) {
var key = genKey(rows[i]);
if (key in uniqueMap) {
uniqueMap[key].push(i);
} else {
uniqueMap[key] = [i];
}
}
}
colorMap = {};
xMap = {};
yMap = {};
for (var key in uniqueMap) {
var ids = uniqueMap[key];
if (ids.length > 1) {
if (fields[x].optype == "numeric") {
var sum = 0;
for (var j = 0; j < ids.length; j++) {
sum += rows[ids[j]][x];
}
xMap[key] = sum / ids.length;
} else {
xMap[key] = rows[ids[0]][x];
}
if (fields[y].optype == "numeric") {
var sum = 0;
for (var j = 0; j < ids.length; j++) {
sum += rows[ids[j]][y];
}
yMap[key] = sum / ids.length;
} else {
yMap[key] = rows[ids[0]][y];
}
if (fields[c].optype == "numeric") {
var sum = 0;
for (var j = 0; j < ids.length; j++) {
sum += rows[ids[j]][c];
}
colorMap[key] = sum / ids.length;
} else {
var cat_counts = {};
for (var j = 0; j < ids.length; j++) {
var cat = rows[ids[j]][c];
if (cat in cat_counts) {
cat_counts[cat] = cat_counts[cat] + 1;
} else {
cat_counts[cat] = 1;
}
}
var max_count = 0;
var max_cat;
for (cat in cat_counts) {
if (cat_counts[cat] > max_count) {
max_count = cat_counts[cat];
max_cat = cat;
}
}
colorMap[key] = max_cat;
if (rows[ids[0]][c] != max_cat) {
for (var j = 0; j < ids.length; j++) {
if (rows[ids[j]][c] == max_cat) {
var temp = ids[0];
ids[0] = ids[j];
ids[j] = temp;
break;
}
}
}
}
} else {
colorMap[key] = rows[ids[0]][c];
xMap[key] = rows[ids[0]][x];
yMap[key] = rows[ids[0]][y];
}
}
}
function updateColorFn() {
if (fields[c].optype == "numeric") {
if (cLogMode && fields[c].min > 0) {
colorFn = d3.scale.log()
.domain([fields[c].min, fields[c].max])
.range(["#3f3", "#f55"])
} else {
if (cLogMode) removeParam("cLog");
colorFn = d3.scale.linear()
.domain([fields[c].min, fields[c].max])
.range(["#3f3", "#f55"])
}
} else {
if (fields[c].cats.length <= 10) {
colorFn = d3.scale.category10().domain(fields[c].cats);
} else {
colorFn = d3.scale.category20().domain(fields[c].cats);
}
}
}
function calcRange(col) {
if (fields[col].optype == "numeric") {
var min = rows[0][col];
var max = rows[0][col];
for (var i = 0; i < rows.length; i++) {
min = Math.min(min, rows[i][col]);
max = Math.max(max, rows[i][col]);
}
fields[col].min = min;
fields[col].max = max;
} else {
var categories = {};
for (var i = 0; i < rows.length; i++) {
var val = rows[i][col];
if (val == null || val == "") {
val = "?";
rows[i][col] = val;
}
categories[val] = true;
}
var finalCats = [];
for (var cat in categories) {
finalCats.push(cat);
}
fields[col].cats = finalCats.sort();
}
}
function updateScale(col, rangeMin, rangeMax, isX) {
if (fields[col].optype == "numeric") {
var firstIndex;
for (firstIndex = 0; firstIndex < shows.length; firstIndex++) {
if (shows[firstIndex]) {
break;
}
}
var min = rows[firstIndex][col];
var max = rows[firstIndex][col];
var uniques = {};
var uniqueCount = 0;
for (var i = 0; i < rows.length; i++) {
if (shows[i]) {
var key = rows[i][col].toString();
if (!(key in uniques)) {
uniques[key] = true;
uniqueCount += 1;
}
min = Math.min(min, rows[i][col]);
max = Math.max(max, rows[i][col]);
}
}
if (min == max) {
var buf = (fields[col].max - fields[col].min) / 100;
if (buf == 0) {
buf = 0.1;
}
min -= buf;
max += buf;
}
if (min > 0 && ((col == x && xLogMode && isX) || (col == y && yLogMode && !isX))) {
return d3.scale.log()
.range([rangeMin, rangeMax])
.domain([min, max]);
} else {
if (min <= 0 && ((col == x && xLogMode && isX) || (col == y && yLogMode && !isX))) {
if (isX) {
xLogMode = false;
removeParam("xLog");
} else {
yLogMode = false;
removeParam("yLog");
}
}
var diff = max - min;
if (uniqueCount > 4) {
max += diff / 30;
min -= diff / 30;
} else {
max += diff / 5;
min -= diff / 5;
}
return d3.scale.linear()
.range([rangeMin, rangeMax])
.domain([min, max]);
}
} else {
if (isX) {
xLogMode = false;
} else {
yLogMode = false;
}
var categories = {};
for (var i = 0; i < rows.length; i++) {
categories[rows[i][col]] = true;
}
var finalCats = [];
for (var cat in categories) {
if (!fields[col].constraint || cat in fields[col].catConstraint) {
finalCats.push(cat);
}
}
return d3.scale.ordinal()
.domain(finalCats.sort())
.rangePoints([rangeMin, rangeMax], 1);
}
}
function updateScales () {
xScale = updateScale(x, buffer, plotWidth, true);
yScale = updateScale(y, plotHeight, 0, false);
xAxis = d3.svg.axis()
.scale(xScale)
.orient("bottom")
.tickPadding(10)
.tickSize(-plotHeight);
yAxis = d3.svg.axis()
.scale(yScale)
.orient("left")
.tickPadding(10)
.tickSize(-plotWidth + buffer);
}
function point_size(index) {
if (shows[index]) {
return r * Math.pow(uniqueMap[genKey(rows[index])].length, 0.5);
} else {
return r;
}
}
function makePoints() {
svg.selectAll(".data")
.data(Array.apply(null, Array(rows.length)).map(function (_, i) {return i;}))
.enter()
.append("g")
.attr("class", "data")
.style("opacity", "0")
.style("fill", "#fff")
.style("stroke", "#fff")
.style("stroke-width", "1.5")
.append("circle")
.attr("class", "point")
.on("click", function(d) {
pointIndex += 1;
updateFieldValues();
})
.on("mouseover", function(d) {
d3.select(this)
.attr("r", point_size(d) + Math.pow(point_size(d), 0.15) + 1);
currentIds = uniqueMap[genKey(rows[d])];
updateFieldValues();
})
.on("mouseout", function(d) {
d3.select(this)
.attr("r", (point_size(d)));
currentIds = null;
pointIndex = 0;
updateFieldValues();
});
}
function updatePoints() {
var transitions = 0;
svg.selectAll(".data")
.style("cursor", function (d) {
if (shows[d] && uniqueMap[genKey(rows[d])].length > 1) {
return "pointer";
} else {
return "auto";
}
})
.sort(function (a, b) {
var pa = point_size(a);
var pb = point_size(b);
if (pa == pb) {
if (a > b) {
return -1;
} else {
return 1;
}
}
if (pa > pb) {
return -1;
} else {
return 1;
}
})
.transition()
.duration(700)
.style("opacity", function (d) {
if (shows[d] && uniqueMap[genKey(rows[d])][0] == d) {
return "0.9";
} else {
return "0";
}
})
.style("fill", function(d) {
if (shows[d]) {
return colorFn(colorMap[genKey(rows[d])]);
} else {
return "#999";
}
})
.style("stroke", function(d) {
if (shows[d]) {
return d3.rgb(colorFn(colorMap[genKey(rows[d])])).darker(0.3);
} else {
return "#999";
}
})
.select(".point")
.attr("display", function (d) {
if (shows[d]) {
return "inherit";
} else {
return "none";
}
})
.attr("r", function(d) {
return point_size(d);
})
.attr("cx", function(d) {
var key = genKey(rows[d]);
if (key in xMap) {
return xScale(xMap[key]);
} else {
if (fields[x].optype == "numeric") {
return Math.round(xScale(rows[d][x]));
} else {
return xScale(rows[d][x]);
}
}
})
.attr("cy", function(d) {
var key = genKey(rows[d]);
if (key in yMap) {
return yScale(yMap[key]);
} else {
if (fields[y].optype == "numeric") {
return Math.round(yScale(rows[d][y]));
} else {
return yScale(rows[d][y]);
}
}
})
.transition()
.attr("display", function (d) {
if (shows[d] && uniqueMap[genKey(rows[d])][0] == d) {
return "inherit";
} else {
return "none";
}
});
}
function revealPoints() {
svg.selectAll(".data")
.data(Array.apply(null, Array(rows.length)).map(function (_, i) {return i;}))
.select(".point")
}
});
</script>
{"fields":[{"id":"000000","preferred":true,"summary":{"splits":[4.51526,4.67252,4.81113,4.89582,4.96139,5.01131,5.05992,5.11148,5.18177,5.35681,5.44129,5.5108,5.58255,5.65532,5.71658,5.77889,5.85381,5.97078,6.05104,6.13074,6.23023,6.29578,6.35078,6.41459,6.49383,6.63013,6.70719,6.79218,6.92597,7.20423,7.64746],"mean":5.84333,"sum_squares":5223.85,"bins":[[4.3,1],[4.425,4],[4.6,4],[4.77143,7],[4.9625,16],[5.1,9],[5.2,4],[5.3,1],[5.4,6],[5.5,7],[5.6,6],[5.7,8],[5.8,7],[5.9,3],[6,6],[6.1,6],[6.2,4],[6.3,9],[6.4,7],[6.5,5],[6.6,2],[6.7,8],[6.8,3],[6.9,4],[7,1],[7.1,1],[7.2,3],[7.3,1],[7.4,1],[7.6,1],[7.7,4],[7.9,1]],"maximum":7.9,"missing_count":0,"variance":0.68569,"median":5.77889,"population":150,"minimum":4.3,"standard_deviation":0.82807,"sum":876.5},"datatype":"double","order":0,"optype":"numeric","name":"Sepal length","column_number":0},{"id":"000001","preferred":true,"summary":{"counts":[[2,1],[2.2,3],[2.3,4],[2.4,3],[2.5,8],[2.6,5],[2.7,9],[2.8,14],[2.9,10],[3,26],[3.1,11],[3.2,13],[3.3,6],[3.4,12],[3.5,6],[3.6,4],[3.7,3],[3.8,6],[3.9,2],[4,1],[4.1,1],[4.2,1],[4.4,1]],"mean":3.05733,"sum_squares":1430.4,"maximum":4.4,"missing_count":0,"variance":0.18998,"median":3.02044,"population":150,"minimum":2,"standard_deviation":0.43587,"sum":458.6},"datatype":"double","order":1,"optype":"numeric","name":"Sepal width","column_number":1},{"id":"000002","preferred":true,"summary":{"splits":[1.25138,1.32426,1.37171,1.40962,1.44567,1.48173,1.51859,1.56301,1.6255,1.74645,3.23033,3.675,3.94203,4.0469,4.18243,4.34142,4.45309,4.51823,4.61771,4.72566,4.83445,4.93363,5.03807,5.1064,5.20938,5.43979,5.5744,5.6646,5.81496,6.02913,6.38125],"mean":3.758,"sum_squares":2582.71,"bins":[[1,1],[1.16667,3],[1.3,7],[1.4,13],[1.5,13],[1.6,7],[1.7,4],[1.9,2],[3,1],[3.3,2],[3.5,2],[3.6,1],[3.75,2],[3.9,3],[4.0375,8],[4.23333,6],[4.46667,12],[4.6,3],[4.74444,9],[4.94444,9],[5.1,8],[5.25,4],[5.46,5],[5.6,6],[5.75,6],[5.95,4],[6.1,3],[6.3,1],[6.4,1],[6.6,1],[6.7,2],[6.9,1]],"maximum":6.9,"missing_count":0,"variance":3.11628,"median":4.34142,"population":150,"minimum":1,"standard_deviation":1.7653,"sum":563.7},"datatype":"double","order":2,"optype":"numeric","name":"Petal length","column_number":2},{"id":"000003","preferred":true,"summary":{"counts":[[0.1,5],[0.2,29],[0.3,7],[0.4,7],[0.5,1],[0.6,1],[1,7],[1.1,3],[1.2,5],[1.3,13],[1.4,8],[1.5,12],[1.6,4],[1.7,2],[1.8,12],[1.9,5],[2,6],[2.1,6],[2.2,3],[2.3,8],[2.4,3],[2.5,3]],"mean":1.19933,"sum_squares":302.33,"maximum":2.5,"missing_count":0,"variance":0.58101,"median":1.32848,"population":150,"minimum":0.1,"standard_deviation":0.76224,"sum":179.9},"datatype":"double","order":3,"optype":"numeric","name":"Petal width","column_number":3},{"id":"000004","preferred":true,"summary":{"missing_count":0,"categories":[["Iris-setosa",50],["Iris-versicolor",50],["Iris-virginica",50]]},"datatype":"string","order":4,"term_analysis":{"enabled":true},"optype":"categorical","name":"Species","column_number":4}],"rows":[[5.0,2.0,3.5,1.0,"Iris-versicolor"],[4.9,2.5,4.5,1.7,"Iris-virginica"],[5.7,4.4,1.5,0.4,"Iris-setosa"],[7.7,3.8,6.7,2.2,"Iris-virginica"],[4.3,3.0,1.1,0.1,"Iris-setosa"],[4.6,3.6,1.0,0.2,"Iris-setosa"],[4.5,2.3,1.3,0.3,"Iris-setosa"],[7.7,2.6,6.9,2.3,"Iris-virginica"],[7.9,3.8,6.4,2.0,"Iris-virginica"],[5.8,4.0,1.2,0.2,"Iris-setosa"],[4.8,3.4,1.6,0.2,"Iris-setosa"],[7.2,3.2,6.0,1.8,"Iris-virginica"],[6.9,3.1,5.1,2.3,"Iris-virginica"],[5.7,2.6,3.5,1.0,"Iris-versicolor"],[5.1,3.8,1.9,0.4,"Iris-setosa"],[5.4,3.9,1.7,0.4,"Iris-setosa"],[6.3,2.8,5.1,1.5,"Iris-virginica"],[6.6,3.0,4.4,1.4,"Iris-versicolor"],[6.3,2.5,5.0,1.9,"Iris-virginica"],[5.0,3.4,1.6,0.4,"Iris-setosa"],[4.4,3.0,1.3,0.2,"Iris-setosa"],[5.8,2.8,5.1,2.4,"Iris-virginica"],[5.6,2.9,3.6,1.3,"Iris-versicolor"],[6.4,3.2,5.3,2.3,"Iris-virginica"],[5.0,3.5,1.3,0.3,"Iris-setosa"],[5.7,2.8,4.1,1.3,"Iris-versicolor"],[5.1,3.3,1.7,0.5,"Iris-setosa"],[5.1,3.8,1.6,0.2,"Iris-setosa"],[5.1,3.8,1.5,0.3,"Iris-setosa"],[6.9,3.2,5.7,2.3,"Iris-virginica"],[4.8,3.0,1.4,0.3,"Iris-setosa"],[7.2,3.6,6.1,2.5,"Iris-virginica"],[5.8,2.7,5.1,1.9,"Iris-virginica"],[4.8,3.0,1.4,0.1,"Iris-setosa"],[5.1,3.7,1.5,0.4,"Iris-setosa"],[6.8,3.0,5.5,2.1,"Iris-virginica"],[5.5,2.6,4.4,1.2,"Iris-versicolor"],[6.9,3.1,5.4,2.1,"Iris-virginica"],[5.8,2.7,3.9,1.2,"Iris-versicolor"],[4.8,3.1,1.6,0.2,"Iris-setosa"],[6.5,3.0,5.5,1.8,"Iris-virginica"],[7.3,2.9,6.3,1.8,"Iris-virginica"],[5.6,2.5,3.9,1.1,"Iris-versicolor"],[5.6,3.0,4.5,1.5,"Iris-versicolor"],[6.0,2.7,5.1,1.6,"Iris-versicolor"],[5.6,2.8,4.9,2.0,"Iris-virginica"],[6.4,2.8,5.6,2.2,"Iris-virginica"],[6.7,2.5,5.8,1.8,"Iris-virginica"],[5.5,2.4,3.7,1.0,"Iris-versicolor"],[5.8,2.6,4.0,1.2,"Iris-versicolor"],[5.9,3.0,4.2,1.5,"Iris-versicolor"],[7.7,3.0,6.1,2.3,"Iris-virginica"],[5.0,3.3,1.4,0.2,"Iris-setosa"],[5.2,3.4,1.4,0.2,"Iris-setosa"],[6.2,2.9,4.3,1.3,"Iris-versicolor"],[5.5,4.2,1.4,0.2,"Iris-setosa"],[4.9,2.4,3.3,1.0,"Iris-versicolor"],[5.7,3.8,1.7,0.3,"Iris-setosa"],[6.1,2.9,4.7,1.4,"Iris-versicolor"],[4.9,3.6,1.4,0.1,"Iris-setosa"],[5.5,2.5,4.0,1.3,"Iris-versicolor"],[6.0,2.2,4.0,1.0,"Iris-versicolor"],[6.3,3.4,5.6,2.4,"Iris-virginica"],[5.1,3.4,1.5,0.2,"Iris-setosa"],[5.9,3.0,5.1,1.8,"Iris-virginica"],[6.7,3.1,4.4,1.4,"Iris-versicolor"],[4.4,3.2,1.3,0.2,"Iris-setosa"],[5.0,3.5,1.6,0.6,"Iris-setosa"],[6.9,3.1,4.9,1.5,"Iris-versicolor"],[5.0,3.6,1.4,0.2,"Iris-setosa"],[5.0,3.0,1.6,0.2,"Iris-setosa"],[4.9,3.1,1.5,0.1,"Iris-setosa"],[7.0,3.2,4.7,1.4,"Iris-versicolor"],[6.2,2.2,4.5,1.5,"Iris-versicolor"],[4.9,3.0,1.4,0.2,"Iris-setosa"],[6.1,2.8,4.7,1.2,"Iris-versicolor"],[5.9,3.2,4.8,1.8,"Iris-versicolor"],[6.0,3.4,4.5,1.6,"Iris-versicolor"],[5.0,3.2,1.2,0.2,"Iris-setosa"],[4.6,3.2,1.4,0.2,"Iris-setosa"],[5.4,3.0,4.5,1.5,"Iris-versicolor"],[6.7,3.1,4.7,1.5,"Iris-versicolor"],[5.4,3.7,1.5,0.2,"Iris-setosa"],[5.0,2.3,3.3,1.0,"Iris-versicolor"],[7.1,3.0,5.9,2.1,"Iris-virginica"],[5.1,3.5,1.4,0.3,"Iris-setosa"],[6.3,3.3,4.7,1.6,"Iris-versicolor"],[6.5,3.0,5.8,2.2,"Iris-virginica"],[5.6,2.7,4.2,1.3,"Iris-versicolor"],[6.6,2.9,4.6,1.3,"Iris-versicolor"],[6.0,2.2,5.0,1.5,"Iris-virginica"],[4.7,3.2,1.3,0.2,"Iris-setosa"],[4.6,3.1,1.5,0.2,"Iris-setosa"],[5.8,2.7,5.1,1.9,"Iris-virginica"],[6.0,2.9,4.5,1.5,"Iris-versicolor"],[5.5,2.4,3.8,1.1,"Iris-versicolor"],[6.5,2.8,4.6,1.5,"Iris-versicolor"],[6.1,2.8,4.0,1.3,"Iris-versicolor"],[5.3,3.7,1.5,0.2,"Iris-setosa"],[4.4,2.9,1.4,0.2,"Iris-setosa"],[6.7,3.3,5.7,2.5,"Iris-virginica"],[7.7,2.8,6.7,2.0,"Iris-virginica"],[6.4,3.1,5.5,1.8,"Iris-virginica"],[5.7,3.0,4.2,1.2,"Iris-versicolor"],[5.1,3.5,1.4,0.2,"Iris-setosa"],[6.5,3.2,5.1,2.0,"Iris-virginica"],[5.7,2.5,5.0,2.0,"Iris-virginica"],[6.7,3.0,5.0,1.7,"Iris-versicolor"],[5.2,3.5,1.5,0.2,"Iris-setosa"],[5.4,3.9,1.3,0.4,"Iris-setosa"],[6.2,2.8,4.8,1.8,"Iris-virginica"],[6.3,2.5,4.9,1.5,"Iris-versicolor"],[7.4,2.8,6.1,1.9,"Iris-virginica"],[5.0,3.4,1.5,0.2,"Iris-setosa"],[4.7,3.2,1.6,0.2,"Iris-setosa"],[5.2,2.7,3.9,1.4,"Iris-versicolor"],[6.7,3.3,5.7,2.1,"Iris-virginica"],[6.3,2.9,5.6,1.8,"Iris-virginica"],[4.8,3.4,1.9,0.2,"Iris-setosa"],[5.7,2.9,4.2,1.3,"Iris-versicolor"],[5.5,2.3,4.0,1.3,"Iris-versicolor"],[6.5,3.0,5.2,2.0,"Iris-virginica"],[5.5,3.5,1.3,0.2,"Iris-setosa"],[6.0,3.0,4.8,1.8,"Iris-virginica"],[6.7,3.1,5.6,2.4,"Iris-virginica"],[6.4,2.8,5.6,2.1,"Iris-virginica"],[7.6,3.0,6.6,2.1,"Iris-virginica"],[6.3,2.3,4.4,1.3,"Iris-versicolor"],[7.2,3.0,5.8,1.6,"Iris-virginica"],[5.7,2.8,4.5,1.3,"Iris-versicolor"],[6.4,3.2,4.5,1.5,"Iris-versicolor"],[6.3,2.7,4.9,1.8,"Iris-virginica"],[4.6,3.4,1.4,0.3,"Iris-setosa"],[6.4,2.7,5.3,1.9,"Iris-virginica"],[6.8,2.8,4.8,1.4,"Iris-versicolor"],[6.1,3.0,4.6,1.4,"Iris-versicolor"],[6.1,3.0,4.9,1.8,"Iris-virginica"],[6.7,3.0,5.2,2.3,"Iris-virginica"],[5.2,4.1,1.5,0.1,"Iris-setosa"],[5.4,3.4,1.5,0.4,"Iris-setosa"],[5.8,2.7,4.1,1.0,"Iris-versicolor"],[6.1,2.6,5.6,1.4,"Iris-virginica"],[4.9,3.1,1.5,0.2,"Iris-setosa"],[5.6,3.0,4.1,1.3,"Iris-versicolor"],[6.3,3.3,6.0,2.5,"Iris-virginica"],[6.8,3.2,5.9,2.3,"Iris-virginica"],[6.4,2.9,4.3,1.3,"Iris-versicolor"],[5.1,2.5,3.0,1.1,"Iris-versicolor"],[6.2,3.4,5.4,2.3,"Iris-virginica"],[5.4,3.4,1.7,0.2,"Iris-setosa"]]}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment