Built with blockbuilder.org
forked from sxywu's block: DS July: Code 1
forked from sxywu's block: DS July: Code 2
forked from sxywu's block: DS July: Code 3
forked from sxywu's block: DS July: Code 4
forked from sxywu's block: DS July: Code 5
forked from sxywu's block: DS July: Code 6
forked from sxywu's block: DS July: Code 7
forked from sxywu's block: Film Flowers, All
forked from anonymous's block: Film Flowers, Refactored
forked from sxywu's block: Film Flowers, Refactored
forked from sxywu's block: Film Flowers, Single Scaled Starter
forked from sxywu's block: Film Flowers, Single Starter
xxxxxxxxxx
<head>
<meta charset="utf-8">
<script src="https://d3js.org/d3.v4.min.js"></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.13.1/lodash.js'></script>
<link href='https://fonts.googleapis.com/css?family=Libre+Baskerville:400,700' rel='stylesheet' type='text/css'>
<style>
svg {
width: 600px;
height: 20000px;
}
</style>
</head>
<body>
<svg></svg>
<script>
const width = 600;
const height = 600;
const petalPaths = [[
'M0,0',
'C50,40 50,70 20,100',
'L0,85',
'L-20,100',
'C-50,70 -50,40 0,0'
],
[
'M0,100',
'L100,100',
'C150,50 100,50 50,0',
'C0,50 -50,50, 0,100'
],
[
'M0,0',
'C100,0 100,50 50,100',
'C20,80 20,70 30,60',
'C60,30 40,10 0,0'
],
[
'M0,0',
'C50,25 50,25 100,0',
'C50,50 50,50 50,100',
'C50,50 50,50 0,0'
]
];
// petal lookup for PG ratings
const pathLookup = {
G: petalPaths[0],
PG: petalPaths[1],
'PG-13': petalPaths[2],
R: petalPaths[3],
};
// grab svg
const svg = d3.select(' svg');
/*****************************************************
** get movie data
******************************************************/
d3.json('movies.json', function(movies) {
movies = _.map(movies, movie => {
return {
rating: ++movie.imdbRating,
votes: parseInt(movie.imdbVotes.replace(/\,/g, '')),
year: ++movie.Year,
title: movie.Title,
pg: movie.Rated,
}
});
// instantiate scales and petal path lookup
const sizeScale = d3.scaleLinear()
.domain([0, 10])
.range([0.1, 1]);
const numPetalsScale = d3.scaleQuantize()
.domain(d3.extent(movies, d => d.votes))
.range(_.range(5, 10));
// 1. create petal data for just the first movie
const pos = Math.floor(Math.random()*movies.length)
const movie = movies[pos];
console.log(movie)
const numberPetals = numPetalsScale(movie.votes)
const petalData = _.times(numberPetals, i => {
return {
rotate: 360 / numberPetals * i,
path: pathLookup[movie.pg].join(' '),
size: sizeScale(movie.rating)
}
})
// 2. draw the petals using d3's data-binding and enter-append
svg.selectAll()
.data(petalData)
.enter().append('path')
.attr('stroke', '#000')
.attr('stroke-width', 2)
.attr('fill', (d, i) => d3.interpolateRainbow(i/numberPetals))
.attr('d', d => d.path)
.attr('transform', (d,i) =>
`translate(200,200) rotate(${d.rotate}) scale(${d.size})`)
svg.selectAll('text')
.data([movie.title])
.enter().append('text')
.attr('x', 100)
.attr('y', 350)
.text(d => d)
});
</script>
</body>
https://d3js.org/d3.v4.min.js
https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.13.1/lodash.js