Weltkarte mit Matplotlib Basemap Toolkit

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Benutzeravatar
MagBen
User
Beiträge: 728
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Weltkarte mit Matplotlib Basemap Toolkit

Beitragvon MagBen » Dienstag 31. Oktober 2017, 13:48

Weltkarte zur Kindersterblichkeit (Tode pro 1000 Geburten)

Bild

Verwendung: https://de.wikipedia.org/wiki/Kindersterblichkeit#Kindersterblichkeit_weltweit

Daten: https://data.worldbank.org/indicator/SH.DYN.MORT?end=2016&start=2016&view=map
Country shapes: http://www.naturalearthdata.com/downloads/110m-cultural-vectors/

  1. """
  2. Number of deaths of infants under five years per 1,000 live births for 2016.
  3. Created with Python and Matplotlib Basemap Toolkit.
  4. """
  5.  
  6. from mpl_toolkits.basemap import Basemap
  7. import matplotlib.pyplot as plt
  8. import numpy as np
  9.  
  10. from matplotlib.patches import Polygon
  11. from matplotlib.collections import PatchCollection
  12. from matplotlib.patches import PathPatch
  13. from matplotlib.colors import LinearSegmentedColormap
  14.  
  15. #########################################################################################
  16. # read mortality data
  17. data = open("API_SH.DYN.MORT_DS2_en_csv_v2/API_SH.DYN.MORT_DS2_en_csv_v2.csv").readlines()
  18. mortality={}
  19. for line in data[5:]:
  20.     line = line.replace('",','|').replace(",","").replace('"',"").strip().split("|")
  21.     if len(line)<10:
  22.         continue
  23.     try:
  24.         value=float(line[-2])
  25.     except:
  26.         continue
  27.     key = line[1]
  28.     mortality[key]=value
  29.  
  30. #########################################################################################
  31. # draw empty worldmap
  32. fig = plt.figure(figsize=(18,8.6))
  33. plt.subplots_adjust(left=0.01, bottom=0.01, right=1.12, top=0.99)
  34.  
  35. m = Basemap(projection='robin',lon_0=0, llcrnrlat=-60,urcrnrlat=85, llcrnrlon=-180, urcrnrlon=180, resolution='l')
  36. m.drawmapboundary()
  37.  
  38.  
  39. #########################################################################################
  40. # color country shapes
  41. m.readshapefile('ne_110m_admin_0_countries/ne_110m_admin_0_countries', name='world', drawbounds=True, color='gray')
  42.  
  43. countries = []
  44. undefined_countries = []
  45. mortList  = []
  46. for info, shape in zip(m.world_info, m.world):
  47.     try:
  48.         mort = mortality[info["ADM0_A3"]]
  49.     except:
  50.         undefined_countries.append(Polygon(np.array(shape), True))
  51.         continue
  52.  
  53.     countries.append(Polygon(np.array(shape), True))
  54.     mortList.append(mort)
  55.    
  56. mortArray = np.array(mortList)
  57. print mortArray.min(), mortArray.max()
  58. ticks = np.linspace(0, 130,14)
  59.  
  60. #########################################################################################
  61. # colorbar
  62. cm = LinearSegmentedColormap.from_list("cm", ["#81fcff", "#19ff19", "#e2f000", "#ffaa31", "#ff8e51", "#ff6969", "#8c0000", "#3c0000"])
  63. p = PatchCollection(countries, alpha=0.5,  zorder=3, cmap=cm)
  64. p.set_array(mortArray)
  65. p.set_clim([ticks.min(), ticks.max()])
  66.  
  67. plt.gca().add_collection(p)
  68. cb = fig.colorbar(p, ticks = ticks, shrink=0.6, pad = 0.02)
  69.  
  70. #########################################################################################
  71. # set countries without data to lightgray
  72. p2 = PatchCollection(undefined_countries, alpha=0.5,  zorder=3, cmap=LinearSegmentedColormap.from_list("lg", ["lightgray", "lightgray"]))
  73. p2.set_array(np.ones((len(undefined_countries),)))
  74. plt.gca().add_collection(p2)
  75.  
  76. #########################################################################################
  77. # save and show
  78. filename = "infant-under-five-mortality-worldmap-2016"
  79. plt.savefig(filename + ".svg")
  80. plt.savefig(filename + "-1800px.png", dpi=100)
  81. plt.savefig(filename + "-900px.png",  dpi=50)
  82.  
  83. plt.show()
a fool with a tool is still a fool, www.magben.de, YouTube
Benutzeravatar
MagBen
User
Beiträge: 728
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Re: Weltkarte mit Matplotlib Basemap Toolkit

Beitragvon MagBen » Samstag 16. Dezember 2017, 11:09

Exportwert in Millionen Dollar (2016)

Bild

Verwendung https://de.wikipedia.org/wiki/Liste_der_L%C3%A4nder_nach_Exporten

  1. """
  2. Amount of exports in millions of dollars per country in 2016, in logarithmic scale.
  3. """
  4.  
  5. from mpl_toolkits.basemap import Basemap
  6. import matplotlib.pyplot as plt
  7. import matplotlib.colors as colors
  8. from matplotlib.colors import LogNorm
  9. import numpy as np
  10.  
  11. from matplotlib.patches import Polygon
  12. from matplotlib.collections import PatchCollection
  13. from matplotlib.patches import PathPatch
  14. from matplotlib.colors import LinearSegmentedColormap
  15.  
  16. #########################################################################################
  17. # read values from data in wiki-table format
  18. data = "".join(open("Export-wiki.txt").readlines())
  19. data = data.replace("\n", "").replace("{","").replace("}","").replace(".","").replace(",",".").split("|-")[1:]
  20. value={}
  21. for line in data:
  22.     line = line.split("|")
  23.     try:
  24.         val=float(line[3])
  25.     except:
  26.         continue
  27.     key = line[2]
  28.     value[key]=val
  29.    
  30. #########################################################################################
  31. # draw empty worldmap
  32. fig = plt.figure(figsize=(18,8.6))
  33. plt.subplots_adjust(left=0.01, bottom=0.01, right=1.12, top=0.99)
  34.  
  35. m = Basemap(projection='robin',lon_0=0, llcrnrlat=-60,urcrnrlat=85, llcrnrlon=-180, urcrnrlon=180, resolution='l')
  36. m.drawmapboundary()
  37.  
  38. #########################################################################################
  39. # color country shapes
  40. m.readshapefile('ne_110m_admin_0_countries/ne_110m_admin_0_countries', name='world', drawbounds=True, color='gray')
  41.  
  42. countries = []
  43. undefined_countries = []
  44. valueList  = []
  45. for info, shape in zip(m.world_info, m.world):
  46.     try:
  47.         val = value[info["ADM0_A3"]]
  48.     except:
  49.         undefined_countries.append(Polygon(np.array(shape), True))
  50.         continue
  51.  
  52.     countries.append(Polygon(np.array(shape), True))
  53.     valueList.append(val)
  54.    
  55. valueArray = np.array(valueList)
  56. print valueArray.min(), valueArray.max()
  57.  
  58. #########################################################################################
  59. # colorbar, modified "gist_rainbow" theme
  60. _gist_rainbow_data = (
  61.         (0.000, (1.00, 1.00, 0.80)),
  62.         #(0.030, (1.00, 0.00, 0.00)),
  63.         (0.215, (1.00, 1.00, 0.00)),
  64.         (0.400, (0.00, 1.00, 0.00)),
  65.         (0.586, (0.00, 1.00, 1.00)),
  66.         (0.770, (0.00, 0.00, 1.00)),
  67.         (0.954, (1.00, 0.00, 1.00)),
  68.         (1.000, (1.00, 0.00, 0.75)))
  69. cm = colors.LinearSegmentedColormap.from_list("cm", _gist_rainbow_data, 256)
  70. p = PatchCollection(countries, alpha=0.5,  zorder=3, cmap=cm, norm=LogNorm(vmin=200, vmax=2e6))
  71. p.set_array(valueArray)
  72.  
  73. plt.gca().add_collection(p)
  74. cb = fig.colorbar(p, shrink=0.6, pad = 0.02, drawedges=False)
  75. cb.solids.set_edgecolor("face")
  76.  
  77. #########################################################################################
  78. # set countries without data to lightgray
  79. p2 = PatchCollection(undefined_countries, alpha=0.5,  zorder=3, cmap=LinearSegmentedColormap.from_list("lg", ["lightgray", "lightgray"]))
  80. p2.set_array(np.ones((len(undefined_countries),)))
  81. plt.gca().add_collection(p2)
  82.  
  83. #########################################################################################
  84. # save and show
  85. filename = "Export-Worldmap-2016"
  86. plt.savefig(filename + ".svg")
  87. plt.savefig(filename + "-1800px.png", dpi=100)
  88. plt.savefig(filename + "-900px.png",  dpi=50)
  89.  
  90. plt.show()
a fool with a tool is still a fool, www.magben.de, YouTube
Sirius3
User
Beiträge: 7065
Registriert: Sonntag 21. Oktober 2012, 17:20

Re: Weltkarte mit Matplotlib Basemap Toolkit

Beitragvon Sirius3 » Samstag 16. Dezember 2017, 12:58

@MagBen: Die Importe könntest Du noch ein bißchen aufräumen. Was für ein seltsames Datenformat hast Du denn da gefunden, das man erst noch so umständlich mit replace bearbeiten muß? Warum nimmst Du nicht die offiziellen csv-Daten? Nackte excepts niemals benutzen. Am besten erst gar nicht in den Fall laufen lassen, dass Du versuchst eine nicht-Zahl zu konvertieren.
Benutzeravatar
MagBen
User
Beiträge: 728
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Re: Weltkarte mit Matplotlib Basemap Toolkit

Beitragvon MagBen » Samstag 16. Dezember 2017, 15:20

Sirius3 hat geschrieben:Die Importe könntest Du noch ein bißchen aufräumen.
Ja, die Karte wird dadurch aber nicht hübscher. Der Hauptgrund für diesen Post ist, ich würde gerne mit Leuten diskutieren, die Python für Karten benutzen.

Sirius3 hat geschrieben:Was für ein seltsames Datenformat hast Du denn da gefunden, das man erst noch so umständlich mit replace bearbeiten muß?
Quelltext einer Tabelle auf Wikipedia.

Sirius3 hat geschrieben:Warum nimmst Du nicht die offiziellen csv-Daten?
Es gibt Daten aus verschiedenen Quellen, z.B. die von der Weltbank. In deren CSV Datei steht alles mögliche drinn. Der Kollege von Wikipedia, der die Tabelle gemacht hat, hat sich aber schon mal die Mühe gemacht, die wesentlichen Daten rauszufiltern. Darauf aufbauend habe ich dann die Karte gemacht.

Sirius3 hat geschrieben:Am besten erst gar nicht in den Fall laufen lassen, dass Du versuchst eine nicht-Zahl zu konvertieren.
Dann müsste ich ja die Arbeit selbst machen, die Python jetzt für mich macht: alle Zeilen rausfiltern, die nicht meiner Annahme entsprechen.
a fool with a tool is still a fool, www.magben.de, YouTube
Benutzeravatar
__deets__
User
Beiträge: 2174
Registriert: Mittwoch 14. Oktober 2015, 14:29

Re: Weltkarte mit Matplotlib Basemap Toolkit

Beitragvon __deets__ » Samstag 16. Dezember 2017, 15:50

MagBen hat geschrieben:
Sirius3 hat geschrieben:Am besten erst gar nicht in den Fall laufen lassen, dass Du versuchst eine nicht-Zahl zu konvertieren.
Dann müsste ich ja die Arbeit selbst machen, die Python jetzt für mich macht: alle Zeilen rausfiltern, die nicht meiner Annahme entsprechen.


Wenn deine Daten so "verhunzt" sind, ist es schon ok sie zu versuchen zu konvertieren, und wenn's in die Hose geht eben den Fehler abzuhandeln. Aber wichtig bleibt dabei keine nackten excepts zu verwenden. Sondern die spezifischen, also zB ValueError, KeyError oder ggf. IndexError. Denn sonst verschreibst du dich & Python wirft eigentlich einen anderen Fehler wie zB NameError und Co - und du bekommst es nicht mit. Darum gewoehnt man sich das am besten gar nicht erst an, um die Fehlersuche handhabbarer zu machen.
Benutzeravatar
MagBen
User
Beiträge: 728
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Re: Weltkarte mit Matplotlib Basemap Toolkit

Beitragvon MagBen » Samstag 16. Dezember 2017, 19:54

__deets__ hat geschrieben:Wenn deine Daten so "verhunzt" sind, ist es schon ok sie zu versuchen zu konvertieren
Ich arbeite oft mit Daten, die zu 99% regelmäßig sind, das ist für mich noch nicht verhunzt.

__deets__ hat geschrieben:Aber wichtig bleibt dabei keine nackten excepts zu verwenden. Sondern die spezifischen, also zB ValueError, KeyError oder ggf. IndexError.
Ich werde mich bessern und mir diese Namen merken.
a fool with a tool is still a fool, www.magben.de, YouTube

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder