map-bubbles.py 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. # Copyright 2021-2024 Avaiga Private Limited
  2. #
  3. # Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
  4. # the License. You may obtain a copy of the License at
  5. #
  6. # http://www.apache.org/licenses/LICENSE-2.0
  7. #
  8. # Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
  9. # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
  10. # specific language governing permissions and limitations under the License.
  11. # -----------------------------------------------------------------------------------------
  12. # To execute this script, make sure that the taipy-gui package is installed in your
  13. # Python environment and run:
  14. # python <script>
  15. # -----------------------------------------------------------------------------------------
  16. import numpy
  17. import pandas
  18. from taipy.gui import Gui
  19. # Largest cities: name, location and population
  20. # Source: https://simplemaps.com/data/world-cities
  21. cities = [
  22. {"name": "Tokyo", "lat": 35.6839, "lon": 139.7744, "population": 39105000},
  23. {"name": "Jakarta", "lat": -6.2146, "lon": 106.8451, "population": 35362000},
  24. {"name": "Delhi", "lat": 28.6667, "lon": 77.2167, "population": 31870000},
  25. {"name": "Manila", "lat": 14.6, "lon": 120.9833, "population": 23971000},
  26. {"name": "São Paulo", "lat": -23.5504, "lon": -46.6339, "population": 22495000},
  27. {"name": "Seoul", "lat": 37.56, "lon": 126.99, "population": 22394000},
  28. {"name": "Mumbai", "lat": 19.0758, "lon": 72.8775, "population": 22186000},
  29. {"name": "Shanghai", "lat": 31.1667, "lon": 121.4667, "population": 22118000},
  30. {"name": "Mexico City", "lat": 19.4333, "lon": -99.1333, "population": 21505000},
  31. {"name": "Guangzhou", "lat": 23.1288, "lon": 113.259, "population": 21489000},
  32. {"name": "Cairo", "lat": 30.0444, "lon": 31.2358, "population": 19787000},
  33. {"name": "Beijing", "lat": 39.904, "lon": 116.4075, "population": 19437000},
  34. {"name": "New York", "lat": 40.6943, "lon": -73.9249, "population": 18713220},
  35. {"name": "Kolkāta", "lat": 22.5727, "lon": 88.3639, "population": 18698000},
  36. {"name": "Moscow", "lat": 55.7558, "lon": 37.6178, "population": 17693000},
  37. {"name": "Bangkok", "lat": 13.75, "lon": 100.5167, "population": 17573000},
  38. {"name": "Dhaka", "lat": 23.7289, "lon": 90.3944, "population": 16839000},
  39. {"name": "Buenos Aires", "lat": -34.5997, "lon": -58.3819, "population": 16216000},
  40. {"name": "Ōsaka", "lat": 34.752, "lon": 135.4582, "population": 15490000},
  41. {"name": "Lagos", "lat": 6.45, "lon": 3.4, "population": 15487000},
  42. {"name": "Istanbul", "lat": 41.01, "lon": 28.9603, "population": 15311000},
  43. {"name": "Karachi", "lat": 24.86, "lon": 67.01, "population": 15292000},
  44. {"name": "Kinshasa", "lat": -4.3317, "lon": 15.3139, "population": 15056000},
  45. {"name": "Shenzhen", "lat": 22.535, "lon": 114.054, "population": 14678000},
  46. {"name": "Bangalore", "lat": 12.9791, "lon": 77.5913, "population": 13999000},
  47. {"name": "Ho Chi Minh City", "lat": 10.8167, "lon": 106.6333, "population": 13954000},
  48. {"name": "Tehran", "lat": 35.7, "lon": 51.4167, "population": 13819000},
  49. {"name": "Los Angeles", "lat": 34.1139, "lon": -118.4068, "population": 12750807},
  50. {"name": "Rio de Janeiro", "lat": -22.9083, "lon": -43.1964, "population": 12486000},
  51. {"name": "Chengdu", "lat": 30.66, "lon": 104.0633, "population": 11920000},
  52. {"name": "Baoding", "lat": 38.8671, "lon": 115.4845, "population": 11860000},
  53. {"name": "Chennai", "lat": 13.0825, "lon": 80.275, "population": 11564000},
  54. {"name": "Lahore", "lat": 31.5497, "lon": 74.3436, "population": 11148000},
  55. {"name": "London", "lat": 51.5072, "lon": -0.1275, "population": 11120000},
  56. {"name": "Paris", "lat": 48.8566, "lon": 2.3522, "population": 11027000},
  57. {"name": "Tianjin", "lat": 39.1467, "lon": 117.2056, "population": 10932000},
  58. {"name": "Linyi", "lat": 35.0606, "lon": 118.3425, "population": 10820000},
  59. {"name": "Shijiazhuang", "lat": 38.0422, "lon": 114.5086, "population": 10784600},
  60. {"name": "Zhengzhou", "lat": 34.7492, "lon": 113.6605, "population": 10136000},
  61. {"name": "Nanyang", "lat": 32.9987, "lon": 112.5292, "population": 10013600},
  62. {"name": "Hyderābād", "lat": 17.3617, "lon": 78.4747, "population": 9840000},
  63. {"name": "Wuhan", "lat": 30.5872, "lon": 114.2881, "population": 9729000},
  64. {"name": "Handan", "lat": 36.6116, "lon": 114.4894, "population": 9549700},
  65. {"name": "Nagoya", "lat": 35.1167, "lon": 136.9333, "population": 9522000},
  66. {"name": "Weifang", "lat": 36.7167, "lon": 119.1, "population": 9373000},
  67. {"name": "Lima", "lat": -12.06, "lon": -77.0375, "population": 8992000},
  68. {"name": "Zhoukou", "lat": 33.625, "lon": 114.6418, "population": 8953172},
  69. {"name": "Luanda", "lat": -8.8383, "lon": 13.2344, "population": 8883000},
  70. {"name": "Ganzhou", "lat": 25.8292, "lon": 114.9336, "population": 8677600},
  71. {"name": "Tongshan", "lat": 34.261, "lon": 117.1859, "population": 8669000},
  72. {"name": "Kuala Lumpur", "lat": 3.1478, "lon": 101.6953, "population": 8639000},
  73. {"name": "Chicago", "lat": 41.8373, "lon": -87.6862, "population": 8604203},
  74. {"name": "Heze", "lat": 35.2333, "lon": 115.4333, "population": 8287693},
  75. {"name": "Chongqing", "lat": 29.55, "lon": 106.5069, "population": 8261000},
  76. {"name": "Hanoi", "lat": 21.0245, "lon": 105.8412, "population": 8246600},
  77. {"name": "Fuyang", "lat": 32.8986, "lon": 115.8045, "population": 8200264},
  78. {"name": "Changsha", "lat": 28.1987, "lon": 112.9709, "population": 8154700},
  79. {"name": "Dongguan", "lat": 23.0475, "lon": 113.7493, "population": 8142000},
  80. {"name": "Jining", "lat": 35.4, "lon": 116.5667, "population": 8081905},
  81. {"name": "Jinan", "lat": 36.6667, "lon": 116.9833, "population": 7967400},
  82. {"name": "Pune", "lat": 18.5196, "lon": 73.8553, "population": 7948000},
  83. {"name": "Foshan", "lat": 23.0292, "lon": 113.1056, "population": 7905700},
  84. {"name": "Bogotá", "lat": 4.6126, "lon": -74.0705, "population": 7743955},
  85. {"name": "Ahmedabad", "lat": 23.03, "lon": 72.58, "population": 7717000},
  86. {"name": "Nanjing", "lat": 32.05, "lon": 118.7667, "population": 7729000},
  87. {"name": "Changchun", "lat": 43.9, "lon": 125.2, "population": 7674439},
  88. {"name": "Tangshan", "lat": 39.6292, "lon": 118.1742, "population": 7577289},
  89. {"name": "Cangzhou", "lat": 38.3037, "lon": 116.8452, "population": 7544300},
  90. {"name": "Dar es Salaam", "lat": -6.8, "lon": 39.2833, "population": 7461000},
  91. {"name": "Hefei", "lat": 31.8639, "lon": 117.2808, "population": 7457027},
  92. {"name": "Hong Kong", "lat": 22.3069, "lon": 114.1831, "population": 7398000},
  93. {"name": "Shaoyang", "lat": 27.2418, "lon": 111.4725, "population": 7370500},
  94. {"name": "Zhanjiang", "lat": 21.1967, "lon": 110.4031, "population": 7332000},
  95. {"name": "Shangqiu", "lat": 34.4259, "lon": 115.6467, "population": 7325300},
  96. {"name": "Nantong", "lat": 31.9829, "lon": 120.8873, "population": 7283622},
  97. {"name": "Yancheng", "lat": 33.3936, "lon": 120.1339, "population": 7260240},
  98. {"name": "Nanning", "lat": 22.8192, "lon": 108.315, "population": 7254100},
  99. {"name": "Hengyang", "lat": 26.8968, "lon": 112.5857, "population": 7243400},
  100. {"name": "Zhumadian", "lat": 32.9773, "lon": 114.0253, "population": 7231234},
  101. {"name": "Shenyang", "lat": 41.8039, "lon": 123.4258, "population": 7208000},
  102. {"name": "Xingtai", "lat": 37.0659, "lon": 114.4753, "population": 7104103},
  103. {"name": "Xi’an", "lat": 34.2667, "lon": 108.9, "population": 7090000},
  104. {"name": "Santiago", "lat": -33.45, "lon": -70.6667, "population": 7026000},
  105. {"name": "Yantai", "lat": 37.3997, "lon": 121.2664, "population": 6968202},
  106. {"name": "Riyadh", "lat": 24.65, "lon": 46.71, "population": 6889000},
  107. {"name": "Luoyang", "lat": 34.6587, "lon": 112.4245, "population": 6888500},
  108. {"name": "Kunming", "lat": 25.0433, "lon": 102.7061, "population": 6850000},
  109. {"name": "Shangrao", "lat": 28.4419, "lon": 117.9633, "population": 6810700},
  110. {"name": "Hangzhou", "lat": 30.25, "lon": 120.1675, "population": 6713000},
  111. {"name": "Bijie", "lat": 27.3019, "lon": 105.2863, "population": 6686100},
  112. {"name": "Quanzhou", "lat": 24.9139, "lon": 118.5858, "population": 6480000},
  113. {"name": "Miami", "lat": 25.7839, "lon": -80.2102, "population": 6445545},
  114. {"name": "Wuxi", "lat": 31.5667, "lon": 120.2833, "population": 6372624},
  115. {"name": "Huanggang", "lat": 30.45, "lon": 114.875, "population": 6333000},
  116. {"name": "Maoming", "lat": 21.6618, "lon": 110.9178, "population": 6313200},
  117. {"name": "Nanchong", "lat": 30.7991, "lon": 106.0784, "population": 6278614},
  118. {"name": "Zunyi", "lat": 27.705, "lon": 106.9336, "population": 6270700},
  119. {"name": "Qujing", "lat": 25.5102, "lon": 103.8029, "population": 6155400},
  120. {"name": "Baghdad", "lat": 33.35, "lon": 44.4167, "population": 6107000},
  121. {"name": "Xinyang", "lat": 32.1264, "lon": 114.0672, "population": 6109106},
  122. ]
  123. # Convert to Pandas DataFrame
  124. data = pandas.DataFrame(cities)
  125. # Add a column holding the bubble size:
  126. # Min(population) -> size = 5
  127. # Max(population) -> size = 60
  128. solve = numpy.linalg.solve([[data["population"].min(), 1], [data["population"].max(), 1]], [5, 60])
  129. data["size"] = data["population"].apply(lambda p: p * solve[0] + solve[1])
  130. # Add a column holding the bubble hover texts
  131. # Format is "<city name> [<population>]"
  132. data["text"] = data.apply(lambda row: f"{row['name']} [{row['population']}]", axis=1)
  133. marker = {
  134. # Use the "size" column to set the bubble size
  135. "size": "size"
  136. }
  137. layout = {"geo": {"showland": True, "landcolor": "4A4"}}
  138. page = """
  139. <|{data}|chart|type=scattergeo|lat=lat|lon=lon|mode=markers|marker={marker}|text=text|layout={layout}|>
  140. """
  141. if __name__ == "__main__":
  142. Gui(page).run(title="Chart - Maps - Bubbles")