【plotlyで地図に書き込む】plotlyで動的な可視化をする【python】


python==3.8
plotly==4.10.0


#地図plotの紹介


簡単にできるscatter_geoとline_geoについて


経度緯度を指定する、もしくは国名をiso-codeから指定することで図を作る事ができます
国名コードは[こちら](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3)

plotlyにはdatasetがいくつか用意されているので、既に国名や情報の記入されているものをつかってみましょう
[サポートしているデータはgithub](https://github.com/plotly/datasets)から確認することができます


国名がiso_alphaに入っており、大陸名をもとに色分けしてみます






#早速plot



```py
import plotly.express as px
df = px.data.gapminder().query("year == 2007")
fig = px.scatter_geo(df, locations="iso_alpha",
                  color="continent",
                  projection="orthographic")
fig.show()
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/ea61a703-707e-67be-ef0c-918ab769a5c6.png)



今回は地球儀のような形式を選択しましたが、地図や半球での表示も指定できます

(line_geo関数を使うと線をつないでくれる)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/ed83a6b9-fa1b-35bc-e9dd-4eacb90cf43c.png)


plotする形式はprojectionに文字形式で渡す必要があり、


```
'equirectangular', 'mercator', 'orthographic', 'natural earth', 'kavrayskiy7', 'miller', 'robinson', 'eckert4', 'azimuthal equal area', 'azimuthal equidistant', 'conic equal area', 'conic conformal', 'conic equidistant', 'gnomonic', 'stereographic', 'mollweide', 'hammer', 'transverse mercator', 'albers usa', 'winkel tripel', 'aitoff', 'sinusoidal'
```

を指定することができます。
もしくは、特定の地域についてのみ議論したい場合には
scopeも指定することができ、

```
 'world', 'usa', 'europe', 'asia', 'africa', 'north america', 'south america', 'albers usa'
```

の地域を拡大して表示することができます

sizeに値を渡すことで、ポイントの大きさを変更することもできます
さらに、アニメーションをつくることもでき、数値や時刻のデータをanimation_frameに渡すことで、
指定した順番で値の変化が進むアニメーションを作成してくれます


```python
import plotly.express as px
df = px.data.gapminder()
fig = px.scatter_geo(df, 
  locations="iso_alpha", 
  color="continent",
  hover_name="country", 
  size="pop",
  animation_frame="year",
  projection="natural earth")
fig.show()
```



![bbb.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/7c81dbeb-1dd5-03b4-0d3c-86b256052dcf.gif)




#より細かい話

FIPScodeを使い、細かい州などの区分で色分けをすることができます
そのためにはgeojsonファイルを用意したり、国コードや州コードを渡す必要があり、説明するのは大変なので
必要な時に必要な分だけ調べていただくのがいいかと思います
plotlyのデータセットとしていくつかのgeojsonは入っているので、コードとデータを見ながら実行したいことに当てはめてみる等をオススメします

```python
from urllib.request import urlopen
import json
with urlopen('https://raw.githubusercontent.com/plotly/datasets/master/geojson-counties-fips.json') as response:
    counties = json.load(response)

import pandas as pd
df = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/fips-unemp-16.csv",
                   dtype={"fips": str})

import plotly.express as px

fig = px.choropleth(df, geojson=counties, locations='fips', color='unemp',
                           color_continuous_scale="Viridis",
                           range_color=(0, 12),
                           scope="usa",
                           labels={'unemp':'unemployment rate'}
                          )
fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0})
fig.show()
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/a0e72e8a-917c-d70d-2a09-c748372e9470.png)




```python
import plotly.express as px

df = px.data.gapminder().query("year == 2007")
avg_lifeExp = (df['lifeExp']*df['pop']).sum()/df['pop'].sum()

fig = px.choropleth(df, locations="iso_alpha", color="lifeExp",
                    color_continuous_scale=px.colors.diverging.BrBG,
                    color_continuous_midpoint=avg_lifeExp,
                    title="World Average Life Expectancy in 2007 in years was %.1f" % avg_lifeExp)
fig.show()
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/3cc37ea9-ea1a-bf98-2ef5-4c01c4070da0.png)




```python
import plotly.express as px
df = px.data.carshare()
fig = px.scatter_mapbox(df, lat="centroid_lat", lon="centroid_lon", color="peak_hour", size="car_hours",
                  color_continuous_scale=px.colors.cyclical.IceFire, size_max=15, zoom=10,
                  mapbox_style="carto-positron")
fig.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/bc323bef-03ba-a1d8-562e-dc7a96be64a3.png)





#以上

[reference](https://plotly.com/python-api-reference/generated/plotly.express.scatter_geo.html)