Creu mapiau gyda Geopandas
Y cwpl o wythnosau diwethaf dechreuais i chwarae gyda chreu mapiau yn Python gan ddefnyddio’r llyfrgell Geopandas. Mae’r llyfrgell yn anhygoel ac rydw i wedi dod yn ffan fawr. Mae’r syntax yn debyg iawn i Pandas, ac mae’n gweithio’n grêt gyda matplotlib hefyd. Mewn gwirionedd mae’r naid o ddefnyddio Pandas i Geopandas yn fach iawn, ac os wyt ti’n gyfforddus gyda Pandas, does dim lot o waith o gwbl i ddeall Geopandas.
Fel rhan o fy ngwaith PhD edrychais i mewn i lefelau amddifadedd (deprivation) yn y pum sir a wasanaethwyd gan Fwrdd Iechyd Aneurin Bevan. Ges i lot o help i ddeall LSOAau, polygonau, a sgorau WIMD gan fy mrawd Rob, sydd wedi cynhyrchu mapiau eisoes yn R. Yn y cofnod blog yma, dangosaf enghreifftiau o’r plotiau rydw i wedi cynhyrchu, a’r cod syml defnyddiais i’w cynhyrchu.
Lawrlwytho Data
Yn fy ngwaith canolbwyntiais ar bum sir yn ne ddwyrain Cymru: Blaenau Gwent, Caerffili, Casnewydd, Sir Fynwy, a Tor-faen. Hefyd roedd angen edrych ar ardaloedd mwy manwl, mor fach a oedd posib. Y categori lleiaf ar gyfer ardaloedd yn Gymru yw LSOAau (Local Super Output Area), sef ardaloedd lle mae rhwng 1000 a 1500 o bobl yn byw. Mae gan bob LSOA cod ac enw: er enghraifft yr LSOA sy’n cynnwys Castell Cas-gwent yw “St Mary’s”, a’i chod yw W01001587.
Er mwyn gallu mapio LSOAau, mae angen gwybod siâp a lleoliad pob ardal. Diffinnir y rhain gan polygonau. Gellir lawrlwytho rhain mewn fformat geojson o’r ONS. Dyma linc i’r data defnyddiais i, sy’n cynnwys pob LSOA yn Gymru a Lloegr:
(Nodwch fod hwn yn set ddata enfawr: 34,753 o LSOAau, pob un yn cynnwys pob fertig o’r polygon sy’n ei ddiffinio. Fe fydd hwn yn cymryd amser i lawrlwytho, ac fe fydd yn cymryd amser i agor gan Geopandas. Y peth cyntaf wnes i oedd hidlo a safio ffeil geojson arall gydag ond yr LSOAau o’r pum sir o ddiddordeb.)
Yn ogystal â’r polygonau, fe ddefnyddiais dau set ddata arall, yn cynnwys gwybodaeth ar fesur amddifadedd WIMD pob LSOA (Welsh Index of Multiple Deprivation, graddfa lle mae WIMD o 1 yn dynodi’r LSOA mwyaf difreintiedig, a 1909 yn dynodi’r LSOA lleiaf difreintiedig), a phoblogaeth dros 60 oed pob LSOA. Fe lawrlwythais i rain o StatsWales a’r ONS:
Darllen Geojson
Mae’n hawdd iawn darllen mewn geojson i geopandas:
import geopandas as gpd
assert geopandas.__version__ == '0.3.0'
world = gpd.read_file('abuhb_world.geojson')
Mae world
yn wrthrych GeoDataFrame
, sydd yn ymddwyn yn union fel DataFrame
pandas.
Ar ôl defnyddio Pandas i ddarllen y setiau data poblogaeth ac amddifadedd,
cyfunais y tair ffrâm data (gan ddefnyddio Pandas) felly bod gan world
tri
colofn ychwanegol: WIMD
, Over 60
a Sir
:
>>> world
objectid lsoa11cd lsoa11nm lsoa11nmw st_areasha st_lengths geometry WIMD Over 60 Sir
0 34131 W01001325 Caerphilly 003A Caerffili 003A 1.975810e+06 9595.912399 POLYGON ((-3.222590332332996 51.69544541936416... 219 342 Caerffili
1 34132 W01001326 Caerphilly 003B Caerffili 003B 1.418504e+06 7206.074574 POLYGON ((-3.218658752736475 51.69265017758838... 190 497 Caerffili
2 34133 W01001327 Caerphilly 014A Caerffili 014A 1.368584e+07 26141.148134 POLYGON ((-3.133625203219097 51.65362006379572... 1114 451 Caerffili
3 34134 W01001328 Caerphilly 014B Caerffili 014B 2.343212e+06 10639.884639 POLYGON ((-3.126845962218699 51.66067765558952... 815 370 Caerffili
4 34135 W01001329 Caerphilly 014C Caerffili 014C 4.799436e+05 4207.033238 POLYGON ((-3.124476654827622 51.63506150073896... 692 365 Caerffili
Plotio Map
Mae plotio map o’r polygonau yn hawdd:
world.plot()
I ddynodi sut i liwio’r polygonau defnyddiwch ddadlau:
- Dynodwch pa golofn i’w ddefnyddio fel gwerthoedd gyda
column
- Dynodwch y map liw i’w ddefnyddio gyda
cmap
Gallwch hefyd integreiddio gydag amgylchedd wrthrych matplotlib:
fig, ax = plt.subplots(1)
world.plot(column='Over 60', cmap='viridis_r', ax=ax)
ax.axis('off')
Trin Geometreg
Mae nifer o ddulliau i drin geometreg y polygonau.
Dull Geopandas o grwpio yw dissolve
, sy’n grwpio polygonau gyda rhinweddau
tebyg a chreu un polygon mawr ohonynt.
Grwpio LSOAau gan sir:
>>> siroedd = world.dissolve(by='Sir')
>>> siroedd
geometry
Sir
Blaenau Gwent POLYGON ((-3.219457536348314 51.74573457863166...
Caerffili POLYGON ((-3.123546981902226 51.58721244839312...
Casnewydd (POLYGON ((-2.903851574580124 51.6274883996199...
Sir Fynwy (POLYGON ((-2.781429130096552 51.5252840700888...
Tor-faen POLYGON ((-2.976496118298735 51.64839999700513...
Gallwn ffeindio canolbwynt polygon gyda centroid
:
siroedd['centroid'] = siroedd['geometry'].centroid
Un defnydd o ganolbwynt polygon yw i labelu polygonau:
fig, ax = plt.subplots(1)
siroedd.plot(color='azure', edgecolor='black', ax=ax)
props = dict(boxstyle='round', facecolor='linen', alpha=1)
for point in siroedd.iterrows():
ax.text(point[1]['centroid'].x,
point[1]['centroid'].y,
point[0],
horizontalalignment='center',
fontsize=10,
bbox=props)
ax.axis('off')
Mae Geopandas hefyd yn dod gyda nifer o ddulliau clyfar i ddelio gyda dafluniadau map gwahanol.
Casgliad
Rydw i wedi joio chwarae gyda Geopandas, a chredaf fod y mapiau a chynhyrchwyd yn brydferth iawn.
Yn olaf, cyfunaf dau fap, LSOAau a siroedd, i edrych ar amddifadedd.
Fan hyn defnyddiaf y GeoDataFrame siroedd
i ychwanegu llinellau du rhwng y
pum sir.
fig, ax = plt.subplots(1, figsize=(10, 6))
world.plot(column='WIMD', ax=ax, cmap='viridis_r')
siroedd.plot(color='None', edgecolor='black', linewidth=2, ax=ax)
ax.axis('off')
vmin = world['WIMD'].min()
vmax = world['WIMD'].max()
# Creu bar liw
sm = plt.cm.ScalarMappable(cmap='viridis_r', norm=plt.Normalize(vmin=vmin, vmax=vmax))
sm._A = []
cbar = fig.colorbar(sm)
Gallwn weld fod gan Sir Fynwy sgorau amddifadedd mwy na’r siroedd eraill. Wrth gymharu â’r map poblogaeth dros 60 oed, gallwn weld fod gan Sir Fynwy mwy o bobl henach na’r siroedd eraill. Mewn gwirionedd, mae patrwm poblogaeth pobl dros 60 oed a phatrwm amddifadedd yn debyg ofnadwy. A ydym wedi sylwi ar rywbeth diddorol? Yw pobl dros 60 yn fwy tebygol i symud i ardaloedd llai difreintiedig?
Er bod y mapiau yn edrych yn neis, mae’n anodd iawn dweud gyda mapiau fel hyn, gan fod gan wybodaeth geograffeg gymaint o gyd-newidynnau. Yn yr achos yma, mae WIMD wedi’i chyfrifo o nifer o gyd-newidynnau. Un ohonynt yw diweithdra: nid yw pobl ymddeol yn cyfri’n ddi-waith, felly os yw nifer o bobl henach yn bwy mewn ardal, fe fydd diweithdra’r ardal yn disgyn. Mae’n debyg fod nifer o gyd-newidynnau WIMD yn cael ei effeithio gan boblogaeth hen bobl, felly ni allwn dynnu unrhyw gasgliadau fan hyn.
Serch hynny, mae Geopandas yn declyn gwych, yn cynhyrchu mapiau pert iawn, ac yn hawdd i’w ddefnyddio os ydych eisoes yn gyfarwydd gyda Pandas.