Powered by AppSignal & Oban Pro

Europe Bubble Map

04_europe_bubble_map.livemd

Europe Bubble Map

Mix.install([
  {:plotly_ex, "~> 0.3"},
  {:kino, "~> 0.18"}
])

Section

Bubble maps use Scattergeo with marker.size: as a list — each value scales the corresponding point's circle. geo.scope: "europe" zooms to Europe.

alias Plotly.{Figure, Scattergeo}

cities = ["London", "Paris", "Berlin", "Madrid", "Rome", "Amsterdam", "Vienna", "Warsaw"]
lat = [51.5074, 48.8566, 52.5200, 40.4168, 41.9028, 52.3676, 48.2082, 52.2297]
lon = [-0.1278, 2.3522, 13.4050, -3.7038, 12.4964, 4.9041, 16.3738, 21.0122]
population = [9_648_110, 2_148_271, 3_669_491, 3_305_408, 2_872_800, 921_402, 1_930_527, 1_790_658]

# Scale population to reasonable bubble sizes
max_pop = Enum.max(population)
sizes = Enum.map(population, &(round(&1 / max_pop * 50) + 5))

Figure.new()
|> Figure.add_trace(
  Scattergeo.new(
    lat: lat,
    lon: lon,
    mode: "markers",
    text: Enum.map(Enum.zip(cities, population), fn {c, p} -> "#{c}: #{p}" end),
    marker: %{
      size: sizes,
      color: sizes,
      colorscale: "Viridis",
      showscale: true,
      colorbar: %{title: %{text: "Relative Size"}}
    }
  )
)
|> Figure.update_layout(
  title: "Europe Bubble Map — City Populations",
  geo: %{
    scope: "europe",
    showland: true,
    landcolor: "#EAEAAE",
    showocean: true,
    oceancolor: "#BDDDE4",
    showcountries: true,
    countrycolor: "#d1d1d1"
  }
)
|> Plotly.show()