简体   繁体   中英

Geopandas plot shapefile on xarray with same legend

I'm trying to create some maps of precipitation data (xarray) with a shapefile of the region of interest on top. However, when Python plots the figures, I get two seperate figures:

降水数据

感兴趣的区域

When I open the data in QGIS they do appear on top of each other, so the coordinate systems do check out. Then I have an additional bonus question: I have to create multiple precipitation maps, on for a visual analysis it would be ideal if I could have the same legend (thus the same min/max for the colorbar) for each map. Anyone an idea how to proceed further?

My code so far:

def chirps_to_map(input1, input2, title):

    projection = input1 + input2

    plt.figure(figsize=(9, 9))

    projection['pr'].plot()

    watershed.plot()

    plt.title(title)

    plt.show()

    plt.close()

    projection.to_netcdf(str(path)+str(title)+".nc")

    return projection

This is a case where it's simpler to use the Matplotlib object-oriented API.

A nice general workflow might be

fig, ax = plt.subplot()
gdf.plot(ax=ax)    # Plot the vector data on the subplot
raster.plot(ax=ax) # Plot the raster data on the same subplot

Example

First, we get some sample raster+vector data

import xarray as xr
import geopandas as gpd
import matplotlib.pyplot as plt

da = xr.tutorial.load_dataset('ROMS_example').zeta.isel(ocean_time=0)
gdf = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
usa = gdf.loc[gdf['name'].eq('United States of America')]

Next, we plot both of the data on the same AxesSubplot

fig, ax = plt.subplots(figsize=(15, 10))
da.plot.pcolormesh(x='lon_rho', y='lat_rho', ax=ax)
usa.plot(ax=ax, edgecolor='red', color='none')

# Focus on the raster extent
ax.set_xlim(-95, -87)
ax.set_ylim(26, 32)

在此处输入图像描述

Bonus: hvPlot way

hvPlot provides a nice unified API for interactive plotting with pandas , xarray , and many other libraries, and might be of interest to people stumbling upon this answer.

Plotting both vector and raster data is rather easy, simply use the * operator.

import hvplot.pandas
import hvplot.xarray

usa.hvplot(geo=True) * da.hvplot.quadmesh(x='lon_rho', y='lat_rho', geo=True)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM