Ausgearbeitete Choroplethenkarte mit Geopandas
Zusammen mit mapclassify bietet Geopandas eine Auswahl von Methoden an um auch extreme Verteilungen der dargestellten Daten zu behandeln.
import geopandas import matplotlib.pyplot as plt from shapely.geometry import Point # Read the shapefile and related data gdf = geopandas.read_file( "swissBOUNDARIES3D_1_3_TLM_KANTONSGEBIET.shp" ) # Necessary because some areas do not have EINWOHNERZ or KANTONSFLA temp = gdf[["KANTONSNUM","EINWOHNERZ","KANTONSFLA"]].copy() temp["density"] = temp["EINWOHNERZ"] / temp["KANTONSFLA"] temp.dropna( inplace=True ) temp.drop( ["EINWOHNERZ","KANTONSFLA"], axis=1, inplace=True ) gdf = gdf.join( temp.set_index("KANTONSNUM"), on="KANTONSNUM" ) # Plot the map ax = gdf.plot( column="density", scheme="natural_breaks", legend=True, legend_kwds={"loc":"upper left","bbox_to_anchor":(0.85,1.)} ) # Definitions for the cities cities = geopandas.GeoDataFrame( { "name": ["Regensdorf", "Bern", "Basel", "Brig", "Zürich"], "position": [Point(2677911.365,1254622.585),Point(2599859.275,1199633.166), Point(2611328.186,1267660.365),Point(2642300.939,1129536.286), Point(2682771.071,1247998.554)], "tx": [2677849,2599858,2617802,2640000,2685000], "ty": [1259315,1190000,1257500,1120000,1236000] }, geometry="position" ) ; # Plot the points cities.plot( ax=ax, color="red", markersize=5 ) # Name the points cities.apply( lambda r: ax.annotate(r[0],xy=(r[2],r[3]),color="white",horizontalalignment="center"), axis=1 ) # Remove axes and margins ax.margins( 0 ) plt.axis( "off" ) # Save plot as SVG plt.savefig( "gpfinal.svg", bbox_inches="tight", pad_inches=0.1 )
Der Parameter scheme der plot-Methode bestimmt wie die Farben auf die Daten gemappt werden. Beachten Sie die ungleichmässigen Intervalle in der Legende.
Die Legende ist in dieser Version ebenfalls hinzugekommen, und so platziert dass sie nicht mit der Karte überlappt.