function y_axis(data, svg, {
width,
height,
ctype = "line",
yDomain,
yFormat,
shared_scale,
fontsize = 25,
tickFormat = ".0f",
marginTop = 10,
marginBottom = 20,
marginLeft = 0,
marginRight = 0,
yRange = [(height - marginTop - marginBottom), marginTop],
showYgrid = true,
suffix = "",
ticks = Math.floor(height/110),
nolabels = false,
chart_id = 1
} = {}, contg) {
console.log(`Y axis - ${yDomain}`)
let self = this
if(contg == undefined) contg = svg;
this.marginRight = marginRight;
if(yDomain === undefined) {
let yext = d3.extent(data, d => d.y)
let range = yext[1] - yext[0]
let rangepad = range * .25
console.log(`Range: [${yext[0]}, ${yext[1]}] (${range}) | Rangepad: ${rangepad}`)
let ymm = (yext[0] >= 0 && yext[0] - range < 0 ? 0 : yext[0] - rangepad)
if(ctype == "bar") {
ymm = (yext[0] < 0 ? yext[0] - (range * .05) : 0)
}
yDomain = [ymm, yext[1] + rangepad];
}
self.yDomain = yDomain
self.yRange = yRange
let yg = contg.append("g")
.classed("yaxis", true)
.attr("name", "yaxis")
self.setMarginRight = function(mr) { self.marginRight = mr}
self.setHeight = function(h) {
height = h;
yRange = [(height - marginTop - marginBottom), marginTop]
}
self.setMarginTop = function(mt) {
marginTop = mt;
yRange = [(height - marginTop - marginBottom), marginTop]
}
self.setMarginBottom = function(mb) {
marginBottom = mb;
yRange = [(height - marginBottom), marginTop]
}
self.setYRange = function(yrng) {
yRange = yrng
}
self.getYRange = function() {
return yRange
}
self.getDomain = function() {
return yDomain
}
self.draw = function() {
self.yScale = d3.scaleLinear(yDomain, yRange);
self.range = yRange
const yAxis = d3.axisLeft(self.yScale)
let yax = yg
.call(yAxis
.ticks(ticks)
.tickSize(-width)
.tickFormat(d3.format(tickFormat)));
let nms = []
let nmix = 0
yax.selectAll(".tick text")
.text(d => (nolabels ? "" : `${d3.format(tickFormat)(d)}${suffix}`))
.style("font-family", "Arial")
.style("font-size", `${12}pt`)
.style("text-anchor", "start")
.style("fill", "#665c54")
.attr("name", (d) => {
nmix++;
nms.push(`yax_${nmix}`)
return `yax_${nmix}`
})
if(showYgrid) {
yax.selectAll(".tick text")
.attr('x', '5')
.attr('dy', '-4');
yax.selectAll(".tick line")
.attr("x2", (width - this.marginRight) - 5)
} else {
yax.selectAll(".tick text")
.attr('x', '5');
yax.selectAll(".tick line")
.attr("x2", 0)
}
self.txtlft = 0;
nms.forEach((n) => {
let yxb = get_bbox(svg, n)
self.txtlft = (self.txtlft > yxb.width ? self.txtlft : yxb.width )
})
let bb = get_bbox(svg, "yaxis")
yg.select(".domain").remove();
yg.selectAll(".tick line")
.style("stroke", "#ababab")
.style("stroke-opacity", 0.4)
}
}