Public
Edited
Feb 29, 2024
Insert cell
Insert cell
file = FileAttachment("co2-emissions-and-gdp.csv").csv()
Insert cell
data = file.map(row => ({
label: row.Entity,
code: row.Code,
year: Number(row.Year),
gdp: toNumberOrNull(row['GDP, PPP (constant 2017 international $)']),
emissionsProduction: toNumberOrNull(row['Annual CO₂ emissions']),
emissionsConsumption: toNumberOrNull(row['Annual consumption-based CO₂ emissions'])
}))
Insert cell
popFile = FileAttachment("world-pop@1.csv").csv()
Insert cell
popFileData = popFile.map(row => ({
key: Number(row['Location code']),
year: Number(row.Year),
pop: parseIntWithSpaces(row['Total Population, as of 1 January (thousands)']) * 1000,
}));
Insert cell
joinedData = data.map(row => {
const region = REGIONS.find(r => r.code === row.code);
if (!region) return null;
const { key } = region;
const popRow = popFileData.find(r => r.key === key && r.year === row.year);
if (!popRow) return null;
return {
...row,
...popRow,
}
}).filter(row => row && row.pop && row.gdp)
Insert cell
Plot.plot({
grid: true,
color: { legend: true },
width,
marginLeft: 100,
x: {
type: "log",
},
y: {
type: "log",
},
marks: [
Plot.ruleY([0]),
Plot.dot(joinedData, {x: "gdp", y: "emissionsProduction", stroke: "year"})
]
})
Insert cell
function toNumberOrNull(input) {
return input === "" ? null : Number(input)
}
Insert cell
function parseIntWithSpaces(input) {
return parseInt(input.split(' ').join(''))
}
Insert cell
countries = data.reduce((acc, row) => {
if (acc.find(c => c.code === row.code)) return acc;
return [...acc, { code: row.code, label: row.label }];
}, [])
Insert cell
REGIONS = [
{ key: 900, name: "World", code: "OWID_WRL" },
{ key: 903, name: "Africa (UN)", code: null },
{ key: 108, name: "Burundi", code: "BDI" },
{ key: 174, name: "Comoros", code: "COM" },
{ key: 262, name: "Djibouti", code: "DJI" },
{ key: 232, name: "Eritrea", code: "ERI" },
{ key: 231, name: "Ethiopia", code: "ETH" },
{ key: 404, name: "Kenya", code: "KEN" },
{ key: 450, name: "Madagascar", code: "MDG" },
{ key: 454, name: "Malawi", code: "MWI" },
{ key: 480, name: "Mauritius", code: "MUS" },
{ key: 175, name: "Mayotte", code: "MYT" },
{ key: 508, name: "Mozambique", code: "MOZ" },
{ key: 638, name: "Réunion", code: "REU" },
{ key: 646, name: "Rwanda", code: "RWA" },
{ key: 690, name: "Seychelles", code: "SYC" },
{ key: 706, name: "Somalia", code: "SOM" },
{ key: 728, name: "South Sudan", code: "SSD" },
{ key: 800, name: "Uganda", code: "UGA" },
{ key: 834, name: "Tanzania", code: "TZA" },
{ key: 894, name: "Zambia", code: "ZMB" },
{ key: 716, name: "Zimbabwe", code: "ZWE" },
{ key: 24, name: "Angola", code: "AGO" },
{ key: 120, name: "Cameroon", code: "CMR" },
{ key: 140, name: "Central African Republic", code: "CAF" },
{ key: 148, name: "Chad", code: "TCD" },
{ key: 178, name: "Congo", code: "COG" },
{ key: 180, name: "Congo", code: "COG" },
{ key: 226, name: "Equatorial Guinea", code: "GNQ" },
{ key: 266, name: "Gabon", code: "GAB" },
{ key: 678, name: "Sao Tome and Principe", code: "STP" },
{ key: 12, name: "Algeria", code: "DZA" },
{ key: 818, name: "Egypt", code: "EGY" },
{ key: 434, name: "Libya", code: "LBY" },
{ key: 504, name: "Morocco", code: "MAR" },
{ key: 729, name: "Sudan", code: "SDN" },
{ key: 788, name: "Tunisia", code: "TUN" },
{ key: 72, name: "Botswana", code: "BWA" },
{ key: 748, name: "Eswatini", code: "SWZ" },
{ key: 426, name: "Lesotho", code: "LSO" },
{ key: 516, name: "Namibia", code: "NAM" },
{ key: 710, name: "South Africa", code: "ZAF" },
{ key: 204, name: "Benin", code: "BEN" },
{ key: 854, name: "Burkina Faso", code: "BFA" },
{ key: 132, name: "Cabo Verde", code: "CPV" },
{ key: 384, name: "Côte d'Ivoire", code: "CIV" },
{ key: 270, name: "Gambia", code: "GMB" },
{ key: 288, name: "Ghana", code: "GHA" },
{ key: 324, name: "Guinea", code: "GIN" },
{ key: 624, name: "Guinea-Bissau", code: "GNB" },
{ key: 430, name: "Liberia", code: "LBR" },
{ key: 466, name: "Mali", code: "MLI" },
{ key: 478, name: "Mauritania", code: "MRT" },
{ key: 562, name: "Niger", code: "NER" },
{ key: 566, name: "Nigeria", code: "NGA" },
{ key: 686, name: "Senegal", code: "SEN" },
{ key: 694, name: "Sierra Leone", code: "SLE" },
{ key: 768, name: "Togo", code: "TGO" },
{ key: 935, name: "Asia (UN)", code: null },
{ key: 398, name: "Kazakhstan", code: "KAZ" },
{ key: 417, name: "Kyrgyzstan", code: "KGZ" },
{ key: 762, name: "Tajikistan", code: "TJK" },
{ key: 795, name: "Turkmenistan", code: "TKM" },
{ key: 860, name: "Uzbekistan", code: "UZB" },
{ key: 156, name: "China", code: "CHN" },
{ key: 344, name: "China, Hong Kong SAR", code: null },
{ key: 446, name: "China, Macao SAR", code: null },
{ key: 158, name: "Taiwan", code: "TWN" },
{ key: 408, name: "North Korea", code: "PRK" },
{ key: 392, name: "Japan", code: "JPN" },
{ key: 496, name: "Mongolia", code: "MNG" },
{ key: 410, name: "South Korea", code: "KOR" },
{ key: 4, name: "Afghanistan", code: "AFG" },
{ key: 50, name: "Bangladesh", code: "BGD" },
{ key: 64, name: "Bhutan", code: "BTN" },
{ key: 356, name: "India", code: "IND" },
{ key: 364, name: "Iran", code: "IRN" },
{ key: 462, name: "Maldives", code: "MDV" },
{ key: 524, name: "Nepal", code: "NPL" },
{ key: 586, name: "Pakistan", code: "PAK" },
{ key: 144, name: "Sri Lanka", code: "LKA" },
{ key: 96, name: "Brunei", code: "BRN" },
{ key: 116, name: "Cambodia", code: "KHM" },
{ key: 360, name: "Indonesia", code: "IDN" },
{ key: 418, name: "Laos", code: "LAO" },
{ key: 458, name: "Malaysia", code: "MYS" },
{ key: 104, name: "Myanmar", code: "MMR" },
{ key: 608, name: "Philippines", code: "PHL" },
{ key: 702, name: "Singapore", code: "SGP" },
{ key: 764, name: "Thailand", code: "THA" },
{ key: 626, name: "Timor-Leste", code: "TLS" },
{ key: 704, name: "Viet Nam", code: "VNM" },
{ key: 51, name: "Armenia", code: "ARM" },
{ key: 31, name: "Azerbaijan", code: "AZE" },
{ key: 48, name: "Bahrain", code: "BHR" },
{ key: 196, name: "Cyprus", code: "CYP" },
{ key: 268, name: "Georgia", code: "GEO" },
{ key: 368, name: "Iraq", code: "IRQ" },
{ key: 376, name: "Israel", code: "ISR" },
{ key: 400, name: "Jordan", code: "JOR" },
{ key: 414, name: "Kuwait", code: "KWT" },
{ key: 422, name: "Lebanon", code: "LBN" },
{ key: 512, name: "Oman", code: "OMN" },
{ key: 634, name: "Qatar", code: "QAT" },
{ key: 682, name: "Saudi Arabia", code: "SAU" },
{ key: 275, name: "Palestine", code: "PSE" },
{ key: 760, name: "Syria", code: "SYR" },
{ key: 792, name: "Türkiye", code: "TUR" },
{ key: 784, name: "United Arab Emirates", code: "ARE" },
{ key: 887, name: "Yemen", code: "YEM" },
{ key: 908, name: "Europe (UN)", code: null },
{ key: 112, name: "Belarus", code: "BLR" },
{ key: 100, name: "Bulgaria", code: "BGR" },
{ key: 203, name: "Czechia", code: "CZE" },
{ key: 348, name: "Hungary", code: "HUN" },
{ key: 616, name: "Poland", code: "POL" },
{ key: 498, name: "Moldova", code: "MDA" },
{ key: 642, name: "Romania", code: "ROU" },
{ key: 643, name: "Russia", code: "RUS" },
{ key: 703, name: "Slovakia", code: "SVK" },
{ key: 804, name: "Ukraine", code: "UKR" },
{ key: 208, name: "Denmark", code: "DNK" },
{ key: 233, name: "Estonia", code: "EST" },
{ key: 234, name: "Faroe Islands", code: "FRO" },
{ key: 246, name: "Finland", code: "FIN" },
{ key: 831, name: "Guernsey", code: null },
{ key: 352, name: "Iceland", code: "ISL" },
{ key: 372, name: "Ireland", code: "IRL" },
{ key: 833, name: "Isle of Man", code: null },
{ key: 832, name: "Jersey", code: null },
{ key: 428, name: "Latvia", code: "LVA" },
{ key: 440, name: "Lithuania", code: "LTU" },
{ key: 578, name: "Norway", code: "NOR" },
{ key: 752, name: "Sweden", code: "SWE" },
{ key: 826, name: "United Kingdom", code: "GBR" },
{ key: 8, name: "Albania", code: "ALB" },
{ key: 20, name: "Andorra", code: "AND" },
{ key: 70, name: "Bosnia and Herzegovina", code: "BIH" },
{ key: 191, name: "Croatia", code: "HRV" },
{ key: 300, name: "Greece", code: "GRC" },
{ key: 380, name: "Italy", code: "ITA" },
{ key: 412, name: "Kosovo", code: "OWID_KOS" },
{ key: 470, name: "Malta", code: "MLT" },
{ key: 499, name: "Montenegro", code: "MNE" },
{ key: 807, name: "North Macedonia", code: "MKD" },
{ key: 620, name: "Portugal", code: "PRT" },
{ key: 674, name: "San Marino", code: "SMR" },
{ key: 688, name: "Serbia", code: "SRB" },
{ key: 705, name: "Slovenia", code: "SVN" },
{ key: 724, name: "Spain", code: "ESP" },
{ key: 40, name: "Austria", code: "AUT" },
{ key: 56, name: "Belgium", code: "BEL" },
{ key: 250, name: "France", code: "FRA" },
{ key: 276, name: "Germany", code: "DEU" },
{ key: 438, name: "Liechtenstein", code: "LIE" },
{ key: 442, name: "Luxembourg", code: "LUX" },
{ key: 492, name: "Monaco", code: null },
{ key: 528, name: "Netherlands", code: "NLD" },
{ key: 756, name: "Switzerland", code: "CHE" },
{ key: 904, name: "Latin America and the Caribbean (UN)", code: null },
{ key: 28, name: "Antigua and Barbuda", code: "ATG" },
{ key: 533, name: "Aruba", code: "ABW" },
{ key: 44, name: "Bahamas", code: "BHS" },
{ key: 52, name: "Barbados", code: "BRB" },
{ key: 92, name: "British Virgin Islands", code: "VGB" },
{ key: 136, name: "Cayman Islands", code: "CYM" },
{ key: 192, name: "Cuba", code: "CUB" },
{ key: 531, name: "Curaçao", code: "CUW" },
{ key: 212, name: "Dominica", code: "DMA" },
{ key: 214, name: "Dominican Republic", code: "DOM" },
{ key: 308, name: "Grenada", code: "GRD" },
{ key: 312, name: "Guadeloupe", code: "GLP" },
{ key: 332, name: "Haiti", code: "HTI" },
{ key: 388, name: "Jamaica", code: "JAM" },
{ key: 474, name: "Martinique", code: "MTQ" },
{ key: 630, name: "Puerto Rico", code: "PRI" },
{ key: 659, name: "Saint Kitts and Nevis", code: "KNA" },
{ key: 662, name: "Saint Lucia", code: "LCA" },
{ key: 663, name: "Saint Martin (French part)", code: null },
{ key: 670, name: "Saint Vincent and the Grenadines", code: "VCT" },
{ key: 534, name: "Sint Maarten (Dutch part)", code: "SXM" },
{ key: 780, name: "Trinidad and Tobago", code: "TTO" },
{ key: 796, name: "Turks and Caicos Islands", code: "TCA" },
{ key: 850, name: "United States Virgin Islands", code: null },
{ key: 84, name: "Belize", code: "BLZ" },
{ key: 188, name: "Costa Rica", code: "CRI" },
{ key: 222, name: "El Salvador", code: "SLV" },
{ key: 320, name: "Guatemala", code: "GTM" },
{ key: 340, name: "Honduras", code: "HND" },
{ key: 484, name: "Mexico", code: "MEX" },
{ key: 558, name: "Nicaragua", code: "NIC" },
{ key: 591, name: "Panama", code: "PAN" },
{ key: 931, name: "South America", code: null },
{ key: 32, name: "Argentina", code: "ARG" },
{ key: 68, name: "Bolivia", code: "BOL" },
{ key: 76, name: "Brazil", code: "BRA" },
{ key: 152, name: "Chile", code: "CHL" },
{ key: 170, name: "Colombia", code: "COL" },
{ key: 218, name: "Ecuador", code: "ECU" },
{ key: 254, name: "French Guiana", code: "GUF" },
{ key: 328, name: "Guyana", code: "GUY" },
{ key: 600, name: "Paraguay", code: "PRY" },
{ key: 604, name: "Peru", code: "PER" },
{ key: 740, name: "Suriname", code: "SUR" },
{ key: 858, name: "Uruguay", code: "URY" },
{ key: 862, name: "Venezuela", code: "VEN" },
{ key: 905, name: "Northern America (UN)", code: null },
{ key: 60, name: "Bermuda", code: "BMU" },
{ key: 124, name: "Canada", code: "CAN" },
{ key: 304, name: "Greenland", code: "GRL" },
{ key: 840, name: "United States of America", code: "USA" },
{ key: 909, name: "Oceania (UN)", code: null },
{ key: 36, name: "Australia", code: "AUS" },
{ key: 554, name: "New Zealand", code: "NZL" },
{ key: 928, name: "Melanesia", code: null },
{ key: 242, name: "Fiji", code: "FJI" },
{ key: 540, name: "New Caledonia", code: "NCL" },
{ key: 598, name: "Papua New Guinea", code: "PNG" },
{ key: 90, name: "Solomon Islands", code: "SLB" },
{ key: 548, name: "Vanuatu", code: "VUT" },
{ key: 954, name: "Micronesia", code: "FSM" },
{ key: 316, name: "Guam", code: null },
{ key: 296, name: "Kiribati", code: "KIR" },
{ key: 584, name: "Marshall Islands", code: "MHL" },
{ key: 583, name: "Micronesia (country)", code: "FSM" },
{ key: 580, name: "Northern Mariana Islands", code: null },
{ key: 957, name: "Polynesia", code: null },
{ key: 16, name: "American Samoa", code: null },
{ key: 258, name: "French Polynesia", code: "PYF" },
{ key: 882, name: "Samoa", code: "WSM" },
{ key: 776, name: "Tonga", code: "TON" },
]
Insert cell

One platform to build and deploy the best data apps

Experiment and prototype by building visualizations in live JavaScript notebooks. Collaborate with your team and decide which concepts to build out.
Use Observable Framework to build data apps locally. Use data loaders to build in any language or library, including Python, SQL, and R.
Seamlessly deploy to Observable. Test before you ship, use automatic deploy-on-commit, and ensure your projects are always up-to-date.
Learn more