Public
Edited
Sep 26, 2023
Insert cell
Insert cell
Insert cell
function parseNumber(dollarStr) {
return +dollarStr.split("$").join("").split(",").join("");
}
Insert cell
function processingFn(year) {
function get(values) {
let obj = {}
values = d3.map(values, function(obj){
let newObj = {...obj};
newObj[revenuesColumn] = parseNumber(obj[revenuesColumn]);
return newObj;
} )
obj[year] = values;
return obj;
}
return get;
}
Insert cell
allData = (await Promise.all([
FileAttachment("furtune500-2023.csv").csv({typed: true}).then(processingFn(2023)),
FileAttachment("furtune500-2022.csv").csv({typed: true}).then(processingFn(2022)),
FileAttachment("furtune500-2021.csv").csv({typed: true}).then(processingFn(2021))
])).reduce((a, v) => (Object.assign(v, a)))
Insert cell
viewof selectYear = Inputs.radio(Object.keys(allData), {label: "Select year", value: "2023"})
Insert cell
data = allData[selectYear]
Insert cell
data
Type Table, then Shift-Enter. Ctrl-space for more options.

Insert cell
Object.keys(data[0])
Insert cell
countryTerritoryColumn = "Country / Territory"
Insert cell
sectorColumn = "Sector"
Insert cell
revenuesColumn = "Revenues ($M)"
Insert cell
countryField = "Country"
Insert cell
countField = "Count"
Insert cell
countByCountry = {
const mapping = d3.rollup(data, v => v.length, d => d[countryTerritoryColumn]);
return d3.map(mapping, function(d) {
let obj = {};
obj[countryField] = d[0];
obj[countField] = d[1];
return obj;
})
}
Insert cell
countBySector = {
const mapping = d3.rollup(data, v => v.length, d => d[sectorColumn]);
return d3.map(mapping, function(d) {
let obj = {};
obj[sectorColumn] = d[0];
obj[countField] = d[1];
return obj;
})
}
Insert cell
revenuesBySector = {
const mapping = d3.rollup(data, v => d3.sum(v, d => d[revenuesColumn]), d => d[sectorColumn]);
return d3.map(mapping, function(d) {
let obj = {};
obj[sectorColumn] = d[0];
obj[revenuesColumn] = d[1];
return obj;
})
}
Insert cell
Insert cell
Insert cell
// https://observablehq.com/@observablehq/plot-horizontal-bar-chart?intent=fork
countByCountryHorizontalBarChart = {
return Plot.plot({
marginLeft: 100,
width: 500,
height: 400,
x: {
axis: "top"
},
marks: [
Plot.ruleX([0]),
Plot.barX(countByCountry, {x: countField, y: countryField, sort: {y: "x", reverse: true}, fill: "steelblue"})
]
})
}
Insert cell
countBySectorHorizontalBarChart = {
return Plot.plot({
marginLeft: 160,
width: 500,
height: 400,
x: {
axis: "top"
},
marks: [
Plot.ruleX([0]),
Plot.barX(countBySector, {x: countField, y: sectorColumn, sort: {y: "x", reverse: true}, fill: "steelblue"})
]
})
}
Insert cell
revenuesBySectorHorizontalBarChart = {
return Plot.plot({
marginLeft: 160,
width: 500,
height: 400,
x: {
axis: "top"
},
marks: [
Plot.ruleX([0]),
Plot.barX(revenuesBySector, {x: revenuesColumn, y: sectorColumn, sort: {y: "x", reverse: true}, fill: "steelblue"})
]
})
}
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more