Skip to content

Instantly share code, notes, and snippets.

@marks
Last active May 14, 2016 20:01
Show Gist options
  • Save marks/d08248fe68a0a69adda503012ac6bab0 to your computer and use it in GitHub Desktop.
Save marks/d08248fe68a0a69adda503012ac6bab0 to your computer and use it in GitHub Desktop.
var callWithJQuery;
callWithJQuery = function(pivotModule) {
if (typeof exports === "object" && typeof module === "object") {
return pivotModule(require("jquery"), require("c3"));
} else if (typeof define === "function" && define.amd) {
return define(["jquery", "c3"], pivotModule);
} else {
return pivotModule(jQuery, c3);
}
};
callWithJQuery(function($, c3) {
var makeC3Chart;
makeC3Chart = function(chartOpts) {
if (chartOpts == null) {
chartOpts = {};
}
return function(pivotData, opts) {
var agg, attrs, base, base1, base2, base3, base4, base5, colKey, colKeys, columns, dataColumns, defaults, fullAggName, groupByTitle, h, hAxisTitle, headers, i, j, k, l, len, len1, len2, len3, len4, m, numCharsInHAxis, numSeries, params, ref, ref1, ref2, ref3, renderArea, result, rotationAngle, row, rowHeader, rowKey, rowKeys, s, scatterData, series, title, titleText, vAxisTitle, val, vals, x, xs;
defaults = {
localeStrings: {
vs: "vs",
by: "by"
},
c3: {}
};
opts = $.extend(true, defaults, opts);
console.log("base",base)
console.log("opts",opts)
console.log("chartOpts",chartOpts)
console.log("pivotData",chartOpts)
console.log("this",this)
if ((base = opts.c3).size == null) {
base.size = {};
}
if ((base1 = opts.c3.size).width == null) {
// base1.width = window.innerWidth / 1.4;
base1.width = $(".chart").width()
}
if ((base2 = opts.c3.size).height == null) {
// base2.height = window.innerHeight / 1.4 - 50;
base2.height = $(".chart").height()
}
if (chartOpts.type == null) {
chartOpts.type = "line";
}
rowKeys = pivotData.getRowKeys();
if (rowKeys.length === 0) {
rowKeys.push([]);
}
colKeys = pivotData.getColKeys();
if (colKeys.length === 0) {
colKeys.push([]);
}
headers = (function() {
var i, len, results;
results = [];
for (i = 0, len = colKeys.length; i < len; i++) {
h = colKeys[i];
results.push(h.join("-"));
}
return results;
})();
rotationAngle = 0;
fullAggName = pivotData.aggregatorName;
if (pivotData.valAttrs.length) {
fullAggName += "(" + (pivotData.valAttrs.join(", ")) + ")";
}
if (chartOpts.type === "scatter") {
scatterData = {
x: {},
y: {},
t: {}
};
attrs = pivotData.rowAttrs.concat(pivotData.colAttrs);
vAxisTitle = (ref = attrs[0]) != null ? ref : "";
hAxisTitle = (ref1 = attrs[1]) != null ? ref1 : "";
groupByTitle = attrs.slice(2).join("-");
titleText = vAxisTitle;
if (hAxisTitle !== "") {
titleText += " " + opts.localeStrings.vs + " " + hAxisTitle;
}
if (groupByTitle !== "") {
titleText += " " + opts.localeStrings.by + " " + groupByTitle;
}
for (i = 0, len = rowKeys.length; i < len; i++) {
rowKey = rowKeys[i];
for (j = 0, len1 = colKeys.length; j < len1; j++) {
colKey = colKeys[j];
agg = pivotData.getAggregator(rowKey, colKey);
if (agg.value() != null) {
vals = rowKey.concat(colKey);
series = vals.slice(2).join("-");
if (series === "") {
series = "series";
}
if ((base3 = scatterData.x)[series] == null) {
base3[series] = [];
}
if ((base4 = scatterData.y)[series] == null) {
base4[series] = [];
}
if ((base5 = scatterData.t)[series] == null) {
base5[series] = [];
}
scatterData.y[series].push((ref2 = vals[0]) != null ? ref2 : 0);
scatterData.x[series].push((ref3 = vals[1]) != null ? ref3 : 0);
scatterData.t[series].push(agg.format(agg.value()));
}
}
}
} else {
numCharsInHAxis = 0;
for (k = 0, len2 = headers.length; k < len2; k++) {
x = headers[k];
numCharsInHAxis += x.length;
}
if (numCharsInHAxis > 50) {
rotationAngle = 45;
}
columns = [];
for (l = 0, len3 = rowKeys.length; l < len3; l++) {
rowKey = rowKeys[l];
rowHeader = rowKey.join("-");
row = [rowHeader === "" ? pivotData.aggregatorName : rowHeader];
for (m = 0, len4 = colKeys.length; m < len4; m++) {
colKey = colKeys[m];
val = parseFloat(pivotData.getAggregator(rowKey, colKey).value());
if (isFinite(val)) {
if (val < 1) {
row.push(val.toPrecision(3));
} else {
row.push(val.toFixed(3));
}
} else {
row.push(null);
}
}
columns.push(row);
}
vAxisTitle = pivotData.aggregatorName + (pivotData.valAttrs.length ? "(" + (pivotData.valAttrs.join(", ")) + ")" : "");
hAxisTitle = pivotData.colAttrs.join("-");
titleText = fullAggName;
if (hAxisTitle !== "") {
titleText += " " + opts.localeStrings.vs + " " + hAxisTitle;
}
groupByTitle = pivotData.rowAttrs.join("-");
if (groupByTitle !== "") {
titleText += " " + opts.localeStrings.by + " " + groupByTitle;
}
}
title = $("<p>", {
style: "text-align: center; font-weight: bold"
});
title.text(titleText);
params = {
axis: {
y: {
label: vAxisTitle
},
x: {
label: hAxisTitle,
tick: {
rotate: rotationAngle,
multiline: false
}
}
},
data: {
type: chartOpts.type
},
tooltip: {
grouped: false
},
color: {
pattern: ["#3366cc", "#dc3912", "#ff9900", "#109618", "#990099", "#0099c6", "#dd4477", "#66aa00", "#b82e2e", "#316395", "#994499", "#22aa99", "#aaaa11", "#6633cc", "#e67300", "#8b0707", "#651067", "#329262", "#5574a6", "#3b3eac"]
}
};
$.extend(params, opts.c3);
if (chartOpts.type === "scatter") {
xs = {};
numSeries = 0;
dataColumns = [];
for (s in scatterData.x) {
numSeries += 1;
xs[s] = s + "_x";
dataColumns.push([s + "_x"].concat(scatterData.x[s]));
dataColumns.push([s].concat(scatterData.y[s]));
}
params.data.xs = xs;
params.data.columns = dataColumns;
params.axis.x.tick = {
fit: false
};
if (numSeries === 1) {
params.legend = {
show: false
};
}
params.tooltip.format = {
title: function() {
return fullAggName;
},
name: function() {
return "";
},
value: function(a, b, c, d) {
return scatterData.t[c][d];
}
};
} else {
params.axis.x.type = 'category';
params.axis.x.categories = headers;
params.data.columns = columns;
}
if (chartOpts.stacked != null) {
params.data.groups = [
(function() {
var len5, n, results;
results = [];
for (n = 0, len5 = rowKeys.length; n < len5; n++) {
x = rowKeys[n];
results.push(x.join("-"));
}
return results;
})()
];
}
renderArea = $("<div>", {
style: "display:none;"
}).appendTo($("body"));
result = $("<div>").appendTo(renderArea);
params.bindto = result[0];
c3.generate(params);
result.detach();
renderArea.remove();
return $("<div>").append(title, result);
};
};
return $.pivotUtilities.c3_renderers = {
"Line Chart": makeC3Chart(),
"Bar Chart": makeC3Chart({
type: "bar"
}),
"Stacked Bar Chart": makeC3Chart({
type: "bar",
stacked: true
}),
"Area Chart": makeC3Chart({
type: "area",
stacked: true
}),
"Scatter Chart": makeC3Chart({
type: "scatter"
})
};
});
// ---
// generated by coffee-script 1.9.2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment