How can I set a special colour for `Nan`s in my plot?

一曲冷凌霜 提交于 2020-01-25 20:54:07

问题


Here is a sample of the data I am trying to visualize

Prince Edward Island    2.333
Manitoba                2.529
Alberta                 2.6444
British Columbia        2.7902
Saskatchewan            2.9205
Ontario                 3.465
New Brunswick           3.63175
Newfoundland and Labrador   3.647
Nova Scotia             4.25333333333
Quebec                  4.82614285714
Nunavut                 NaN
Yukon                   NaN
Northwest Territories   NaN

I want to visualize the data by colouring each province according to the number it is associated with. When I do this, the Nan's are coloured like the minimum value of the colormap. Is there an easy way to map Nan to white?

Here is my code:

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


vmin, vmax = canada.Partying.min(), canada.Partying.max()

ax = canada.plot(column='Partying', cmap='viridis', vmin=vmin, vmax=vmax)

# add colorbar
fig = ax.get_figure()
cax = fig.add_axes([0.9, 0.1, 0.03, 0.8])
sm = plt.cm.ScalarMappable(cmap='viridis', norm=plt.Normalize(vmin=vmin, vmax=vmax))
# fake up the array of the scalar mappable. Urgh...
sm._A = []
fig.colorbar(sm, cax=cax)
plt.savefig('Canada.pdf')

回答1:


You may combine two layers:

## import statements
import geopandas as gpd
import numpy as np
import matplotlib.pyplot as plt

## load the Natural Earth data set 
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))

## add a column with NaNs
## here we set all countries with a population > 10e7 to nan
world["pop_est_NAN"] = world.pop_est.apply(lambda x: x if x <10e7 else np.nan)

## first layer, all geometries included 
ax = world.plot(color="grey")

## second layer, NaN geometries excluded
## we skip the entries with NaNs by calling .dropna() on the dataframe
## we reference the first layer by ax=ax
## we specify the values we want to plot (column="pop_est")
world.dropna().plot(ax=ax, column="pop_est")

## add title
ax.set_title("Countries with a population > 10e7 (= missing values) \nare plotted in grey");

## save fig
plt.savefig("geopandas_nan_plotting.png", dpi=200)

Take a look at the geopandas documentation for an alternative method using matplotlib objects.




回答2:


Update: New feature in geopandas solves your problem: You can now use:

ax = canada.plot(column='Partying', cmap='viridis', vmin=vmin, vmax=vmax,
     missing_kwds= dict(color = "lightgrey",) )

To make all missing data regions light grey.

See https://geopandas.readthedocs.io/en/latest/mapping.html (actually, the documentation may say that the parameter is missing_kwdsdict, but the above is what works for me)



来源:https://stackoverflow.com/questions/38473257/how-can-i-set-a-special-colour-for-nans-in-my-plot

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!