Skip welcome & menu and move to editor
Welcome to JS Bin
Load cached copy from
 
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>Tutorial: a bubble chart with D3</title>
  <script src="https://d3js.org/d3.v7.min.js"></script>
</head>
  
<body>
  <h1>A bubble chart with D3</h1>
</body>
</html>
 
.Asia {
  fill: #FF265C
}
.Europe {
  fill: #FFE700
}
.Africa {
  fill: #4ED7E9
}
.Americas {
  fill: #70ED02
}
.Oceania {
  fill: purple
}
.tick line {
  stroke: #DDEAED
}
.tick text {
  color: #878787;
  font-size: 14px
}
#year {
  font-size: 300px;
  text-anchor: middle;
  fill: #DADADA;
  letter-spacing: 40px;
}
div.tooltip {   
    position: absolute;         
    text-align: center;                             
    height: 24px;
    padding: 5px;               
    font: 18px sans-serif;      
    background: white;  
    border: 2px solid black;        
    border-radius: 8px;         
    pointer-events: none;           
}
 
//D3 margin convention, see https://bl.ocks.org/mbostock/3019563
const margin = {top: 20, right: 10, bottom: 20, left: 10};
const width = 800 - margin.left - margin.right;
const height = 600 - margin.top - margin.bottom;
const g = 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})`);
const tooltip = d3.select("body").append("div") 
      .attr("class", "tooltip")             
      .style("opacity", 0);
const dataUrl = "https://docs.google.com/spreadsheets/d/e/2PACX-1vRpzJYEJv9hkwx3ZLaimdpZmrHK_hyPGXlAho_BaM2p_qsWRygvorbif1KvyPP_k0mt6j04vIL0ANUT/pub?gid=43247911&single=true&output=csv"
d3.csv(dataUrl).then(data => {
  data.forEach(function(d){
    d.income = +d.income;
    d.lifeexp = +d.lifeexp;
    d.population = +d.population;
  })
  const maxpop = d3.max(data, d => d.population);
  
  data.sort(function(a,b){
    return b.population - a.population;
  });
  
  g.append("text")
    .attr("x", width/2)
    .attr("y", height*2/3)
    .text("2018")
    .attr("id", "year");
  
  const xScale = d3.scaleLog()
    .domain([400,100000])
    .range([0,width]);
  const yScale = d3.scaleLinear()
    .domain([15,90])
    .range([height,0])
  const rScale = d3.scaleSqrt()
    .domain([0, maxpop])
    .range([0,50]);
  
  const colors =["#FF265C", "#FFE700", "#4ED7E9", "#70ED02", "purple"];
  const colorScale = d3.scaleOrdinal()
    .domain(["Asia", "Europe", "Africa", "Americas", "Oceania"])
    .range(colors);
  
  const yAxis = d3.axisLeft(yScale)
    .tickSizeInner(-width);
  g.append("g")
    .attr("transform", "translate(10,0)")
    .call(yAxis);
  
  const xAxis = d3.axisBottom(xScale)
    .tickValues([500, 1000, 2000, 4000, 8000, 16000, 32000, 64000])
    .tickFormat(d3.format(".1s"))
    .tickSizeInner(-height);
  g.append("g")
    .attr("transform", `translate(10,${height})`)
    .call(xAxis);
  
  g.selectAll("circle")
    .data(data)
    .join("circle")
    //.attr("class", (d) => d.continent)
    .attr("cx", (d) => xScale(d.income))
    .attr("cy", (d) => yScale(d.lifeexp))
    .attr("r", (d) => rScale(d.population))
    .style("fill", (d) => colorScale(d.continent))
    .style("stroke", "black")
      .on("mouseover", (event,d) => {   
      tooltip.style("opacity", 1)   
          .text(d.country)  
          .style("left", (d3.pointer(event)[0] + 10) + "px")        
          .style("top", (d3.pointer(event)[1]+50) + "px");  
            })                  
     .on("mouseout", (d) => {
       tooltip.style("opacity", 0);});
});
Output

You can jump to the latest bin by adding /latest to your URL

Dismiss x
public
Bin info
maartenzampro
0viewers