Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Geopandas reduce legend size (and remove white space below map)

I would like to know how to change the legend automatically generated by Geopandas. Mostly I would like to reduce its size because it's quite big on the generated image. The legend seems to take all the available space.

Additional question, do you know how to remove the empty space below my map ? I've tried with

pad_inches = 0, bbox_inches='tight' 

but I still have an empty space below the map.

enter image description here

Thanks for your help.

like image 876
Arnaud Geotribu Avatar asked Jan 17 '19 12:01

Arnaud Geotribu


People also ask

Is it possible to use markersize in geopandas?

In geopandas >= 0.3 (released September 2017), the plotting of points is based on the scatter plot method of matplotlib under the hood, and this accepts a variable markersize. So now you can actually pass a column to markersize, what the OP did in the original question:

How do I create interactive maps in geopandas?

This page was generated from docs/user_guide/interactive_mapping.ipynb. Alongside static plots, geopandas can create interactive maps based on the folium library. Creating maps for interactive exploration mirrors the API of static plots in an explore () method of a GeoSeries or GeoDataFrame.

Can geopandas create a legend from a label Object?

But can geopandas create a legend using the unique symbology applied to each (group) like ax.legend () can do natively if there is a label object? @lwasser I think the answer to this is no.

Why do we use geopandas?

I hope this quick tutorial was helpful in understanding how to use GeoPandas and understand why it is such a powerful tool. Using GeoPandas is a great way to visualize geospatial data during any exploratory data analysis. It provides a way to make inferences about your data set and most importantly it brings data to life for everyone to see.


2 Answers

This works for me:

some_geodataframe.plot(..., legend=True, legend_kwds={'shrink': 0.3})

Other options here: https://matplotlib.org/api/_as_gen/matplotlib.pyplot.colorbar.html

like image 179
Chris Withers Avatar answered Sep 28 '22 09:09

Chris Withers


To show how to get proper size of a colorbar legend accompanying a map created by geopandas' plot() method I use the built-in 'naturalearth_lowres' dataset.

The working code is as follows.

import matplotlib.pyplot as plt
import geopandas as gpd

world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
world = world[(world.name != "Antarctica") & (world.name != "Fr. S. Antarctic Lands")]  # exclude 2 no-man lands

plot as usual, grab the axes 'ax' returned by the plot

colormap = "copper_r"   # add _r to reverse the colormap
ax = world.plot(column='pop_est', cmap=colormap, \
                figsize=[12,9], \
                vmin=min(world.pop_est), vmax=max(world.pop_est))

map marginal/face deco

ax.set_title('World Population')
ax.grid() 

colorbar will be created by ...

fig = ax.get_figure()
# add colorbar axes to the figure
# here, need trial-and-error to get [l,b,w,h] right
# l:left, b:bottom, w:width, h:height; in normalized unit (0-1)
cbax = fig.add_axes([0.95, 0.3, 0.03, 0.39])   
cbax.set_title('Population')

sm = plt.cm.ScalarMappable(cmap=colormap, \
                norm=plt.Normalize(vmin=min(world.pop_est), vmax=max(world.pop_est)))

at this stage, 'cbax' is just a blank axes, with un needed labels on x and y axes blank-out the array of the scalar mappable 'sm'

sm._A = []

draw colorbar into 'cbax'

fig.colorbar(sm, cax=cbax, format="%d")

# dont use: plt.tight_layout()
plt.show()

Read the comments in the code for useful info.

The resulting plot: enter image description here

like image 45
swatchai Avatar answered Sep 28 '22 09:09

swatchai