{
const width=1500;
const height=4000;
const sunR = 50;
const dotSpacing = sunR/15;
const charcoal = "#545253";
const scaleColor = "#ebe9e3";
const labelColor = "#545253";
const occCount = filteredData.length
const gapMinMax = d3.extent(filteredData, d => d.payGap);
const maxRayLength = sunR*5.5
const rayEndPoint = d3.scaleLinear()
.domain(gapMinMax)
.range([sunR*1.3,maxRayLength]);
const distinctIndustries = [...new Set(filteredData.map(d=> d.industryGrouping))]
var findIndustryIndex = d3.scaleBand()
.domain(distinctIndustries)
.range([0,distinctIndustries.length])
var groupIndex = d3.scaleBand()
.domain(distinctIndustries)
.range([0,distinctIndustries.length])
const myNest = d3c.nest()
.key(item => item.industryGrouping)
.object(filteredData)
console.log(myNest)
const sunBuildData = _.map(myNest, (occs,i)=> {
const occCount = occs.length
const womenShare = occs.womenCount / occs.totalCount
var sunAngle = 180
if(occCount < 13) {sunAngle = 90}
if(occCount > 30) {sunAngle = 360}
return {
xPos: (groupIndex(i) % 2 ) * 450,
yPos: Math.floor(groupIndex(i) / 2) * 400,
groupName: i,
occCount,
industryIndex: findIndustryIndex(occs.industryGrouping),
sunAngle,
rays: _.map(occs, (d,i) => {
var OccName = d.Occupation
var numDots = Math.round(d.dollDiff/1000)
var dotLength = numDots*dotSpacing
var thisRayLength = Math.round(rayEndPoint(d.payGap)) - dotLength
const thisAngle = (-sunAngle / occCount) * i - 90
return {
OccName,
thisAngle,
textAngle: (-sunAngle / occCount) * i - 1,
thisRayLength,
dots: _.times(numDots, i => {
var dotShapeIndicator = .5
if ((i+1)%5 ==0) { dotShapeIndicator = 1 }
return { dotPos: thisRayLength + dotSpacing *(i+1), dotShapeIndicator, thisAngle}
})
}
})
}
})
console.log(sunBuildData)
const svg = DOM.svg(width,height);
const myCanvas = d3.select(svg)
.append("g")
.attr("transform", `translate(${300},${300})`)
var myDataDrawing = myCanvas.selectAll('g')
.data(sunBuildData)
.enter()
.append('g')
.attr('class',`industryGroupData`)
.attr("transform", occs =>`translate(${occs.xPos},${occs.yPos})`)
myCanvas.selectAll('g.industryGroupData')
.append('circle')
.attr('cx', `0`)
.attr('cy', `0`)
.attr("r", `${rayEndPoint(0)}`)
.attr("fill",`yellow`)
myCanvas.selectAll('g.industryGroupData')
.append('text')
.style("font-size","8px")
.attr("fill", `${charcoal}`)
.attr("font-family", "Sans-Serif")
.text(occs =>`${occs.groupName.toUpperCase()}`)
.attr("transform", `translate(${0},${20})`)
.style("text-anchor", "middle")
myCanvas.selectAll('g.industryGroupData')
.append('circle')
.attr('cx', `0`)
.attr('cy', `0`)
.attr("r", `${rayEndPoint(10)}`)
.attr("stroke", `${scaleColor}`)
.attr("fill", 'none')
myCanvas.selectAll('g.industryGroupData')
.append('circle')
.attr('cx', `0`)
.attr('cy', `0`)
.attr("r", d => `${rayEndPoint(20)}`)
.attr("stroke", `${scaleColor}`)
.attr("fill", 'none')
myCanvas.selectAll('g.industryGroupData')
.append('circle')
.attr('cx', `0`)
.attr('cy', `0`)
.attr("r", d => `${rayEndPoint(30)}`)
.attr("stroke", `${scaleColor}`)
.attr("fill", 'none')
var mySuns = myDataDrawing.selectAll('g.industryGroupData')
.data(occs => occs.rays)
.enter()
.append('g')
.attr('class',`occData`)
myCanvas.selectAll('g.occData')
.append('path')
.attr('d',d=> `M0,${sunR} L0,${d.thisRayLength}`)
.attr("transform", d => `rotate(${d.thisAngle})`)
.attr('stroke', d => `${charcoal}`)
.attr('fill', `none`)
myCanvas.selectAll('g.occData')
.append('text')
.text(d =>`${d.OccName.toUpperCase()}`)
.attr('x', d=> `${sunR+1}`)
.attr('y', `0`)
.style("font-size","4.5px")
.attr("fill", `${charcoal}`)
.attr("font-family", "Sans-Serif")
.attr("transform", d => `rotate(${d.textAngle})`)
mySuns.selectAll('g.occData')
.data(d => d.dots)
.enter()
.append('g')
.attr('class',`dotsData`)
myCanvas.selectAll('g.dotsData')
.append('circle')
.attr('cx', `0`)
.attr('cy', d => `${d.dotPos}`)
.attr("r", d => `${d.dotShapeIndicator}`)
.attr("fill", `${charcoal}`)
.attr("transform", d => `rotate( ${d.thisAngle})`);
return svg
}