如何用Python画出好看的地图

下面主要是用
  • folium
  • Plotly
  • GeoPandas+Matplotlib
三种方式绘制地图。

01 folium

1import folium
2import pandas as pd
3#输入上海经纬度,尺度
4latitude = 31.2
5longitude = 121.5
6sh_map = folium.Map(location=[latitude, longitude], zoom_start=10)
7sh_map
如何用Python画出好看的地图
默认为'OpenStreetMap'风格,我们还可以选择'Stamen Terrain', 'Stamen Toner'等。
1sh_map = folium.Map(location=[latitude, longitude], zoom_start=10,tiles='Stamen Toner')
2sh_map
如何用Python画出好看的地图
有了底图把带有经纬度的数据点映射上去,这里用上次上海poi中的火锅数据:
如何用Python画出好看的地图
把火锅店数据放到地图上:
 1# 创建特征组
 2hotpots = folium.map.FeatureGroup()
 3# Loop through the 200 crimes and add each to the incidents feature group
 4for lat, lng, in zip(data.lat, data.lon):
 5    hotpots.add_child(
 6        folium.CircleMarker(
 7            [lat, lng],
 8            radius=7# define how big you want the circle markers to be
 9            color='yellow',
10            fill=True,
11            fill_color='red',
12            fill_opacity=0.4
13        )
14    )
15
16# 把火锅特征组放到上海地图上
17sh_map =folium.Map(location=[latitude, longitude], zoom_start=10)
18sh_map.add_child(hotpots)
如何用Python画出好看的地图
点太多看不出什么,我们下面只放嘉定区的数据:
如何用Python画出好看的地图
我们可以继续添加火锅店名字信息并标注在上图:
1latitudes = list(datas.lat)
2longitudes = list(datas.lon)
3labels = list(datas.name)
4for lat, lng, label in zip(latitudes, longitudes, labels):
5    folium.Marker([lat, lng], popup=label).add_to(sh_map)      
6sh_map
如何用Python画出好看的地图
最后我们绘制每个区的火锅数量的Choropleth Map,不同颜色代表火锅数量。
首先读取上海行政区geojson文件:
如何用Python画出好看的地图
统计各个区火锅数量:
1hots=data.groupby('adname',as_index=False).agg({'name':"count"})
2hots.columns=['district','num']
3hots
如何用Python画出好看的地图
开始绘制Choropleth Map,下面key_on='feature.properties.name'是因为我们这里下载的上海geojson中name对应于行政区,这个根据具体数据而定。
如何用Python画出好看的地图
 1#输入上海经纬度,尺度
 2latitude = 31.2
 3longitude = 121.5
 4map = folium.Map(location=[latitude, longitude], zoom_start=12)
 5folium.Choropleth(
 6    geo_data=geo_data,
 7    data=hots,
 8    columns=['district','num'],
 9    key_on='feature.properties.name',
10    #fill_color='red',
11    fill_color='YlOrRd',
12    fill_opacity=0.7,
13    line_opacity=0.2,
14    highlight=True,
15    legend_name='Hotpot Counts in Shanghai'
16).add_to(map)
17map
如何用Python画出好看的地图
▲浦东新区一马当先,嘉定区榜上有名

02 Plotly

用Plotly画Choropleth Map跟folium很类似,这里直接继续用前面处理好的数据。
 1import plotly.express as px
 2import plotly.graph_objs as go
 3latitude = 31.2
 4longitude = 121.5
 5fig = px.choropleth_mapbox(
 6    data_frame=hots,
 7    geojson=geo_data,
 8    color='num',
 9    locations="district",
10    featureidkey="properties.name",
11    mapbox_style="carto-positron",
12    color_continuous_scale='viridis',
13    center={"lat": latitude, "lon": longitude},
14    zoom=7.5,
15)
16fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0})
17fig.show()
如何用Python画出好看的地图
设置mapbox_style="carto-darkmatter"换一种风格。
如何用Python画出好看的地图
更多用Plotly画图的例子见
https://plotly.com/python/

03 GeoPandas+Matplotlib

先利用GeoPandas绘制出各行政区轮廓:
 1import matplotlib.pyplot as plt
 2import matplotlib as mpl
 3# 中文和负号的正常显示
 4mpl.rcParams['font.sans-serif'] = ['Times New Roman']
 5mpl.rcParams['font.sans-serif'] = [u'SimHei']
 6mpl.rcParams['axes.unicode_minus'] = False
 7# 裁剪上海shape
 8fig, ax = plt.subplots(figsize=(2010))
 9ax=geo_data.plot(ax=ax,facecolor='grey',edgecolor='white',linestyle='--',alpha=0.8)
10ax.axis('off'# 移除坐标轴
如何用Python画出好看的地图
将统计的各个区的火锅店数量与geo_data合并:
1need_data=pd.merge(geo_data,hots[['district','num']],left_on='name',
2                 right_on='district')
3need_data
如何用Python画出好看的地图
此时数据已经是dataframe,不是geodataframe了,所以需要继续转换一下。
1need_data = gpd.GeoDataFrame(need_data)
2need_data.geom_type
如何用Python画出好看的地图
可以看到这个时候need_data已经是geodataframe类型了。
1fig, ax = plt.subplots(figsize=(2010))
2need_data.plot('num', cmap='OrRd',ax=ax)
3ax.axis('off'# 移除坐标轴
4cmap = mpl.cm.get_cmap('OrRd')
5norm = mpl.colors.Normalize(min(need_data['num']), max(need_data['num']))
6fcb = fig.colorbar(mpl.cm.ScalarMappable(norm=norm, cmap=cmap),ax=ax)
7ax=geo_data.plot(ax=ax,facecolor='grey',edgecolor='white',linestyle='--',alpha=0.2)
8ax.set_title('Hotpot Count in Shanghai', fontsize=20)
如何用Python画出好看的地图
不熟悉上海的人是看不出来各个区的,这里可以继续加行政区标注:
 1fig, ax = plt.subplots(figsize=(2010))
 2need_data.plot('num', cmap='OrRd',ax=ax)
 3for idx, _ in enumerate(need_data.geometry.representative_point()):
 4    # 提取行政区名称
 5    region = need_data.loc[idx, 'name']
 6    ax.text(_.x, _.y, region, ha="center", va="center", size=8)
 7ax.axis('off'# 移除坐标轴
 8cmap = mpl.cm.get_cmap('OrRd')
 9norm = mpl.colors.Normalize(min(need_data['num']), max(need_data['num']))
10fcb = fig.colorbar(mpl.cm.ScalarMappable(norm=norm, cmap=cmap),ax=ax)
11ax=geo_data.plot(ax=ax,facecolor='grey',edgecolor='white',linestyle='--',alpha=0.2)
12ax.set_title('Hotpot Count in Shanghai', fontsize=20)
如何用Python画出好看的地图

原文始发于微信公众号(大数据DT):如何用Python画出好看的地图

继续阅读
  • 文本由 发表于 2020年11月21日10:03:24
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
“淮河”怎么治? 学霸

“淮河”怎么治?

从1950年10月14日中央人民政府作出《关于治理淮河的决定》至今,已过去整整70年。 淮河,它没有长江与黄河的“名声”,但有两个特别的头衔:最难治理的河流、新中国成立后第一条全面系统治理的大河。 为...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: