地图(八)利用python绘制散点地图
散点地图(Scatter Map)简介
散点地图可以在地图上呈现数据点,根据散点的性质对当前区域进行可视化分析。
快速绘制
-
基于pyecharts的散点地图(Scatter Map)
from pyecharts.charts import * from pyecharts import options as opts import pandas as pd geo = Geo(init_opts=opts.InitOpts(theme='dark', bg_color='#000000', width='1000px', height='800px')) # 导入数据 df = pd.read_csv('https://raw.githubusercontent.com/HsuHeinrich/data-collection/master/graph/weibo.csv') # 将数据分为强中弱三类 weak, strong, normal = [], [], [] for idx, row in df.iterrows(): if row.num < 10: weak.append((idx, row.num)) geo.add_coordinate(idx, row.lon, row.lat) elif 10 <= row.num < 30: normal.append((idx, row.num)) geo.add_coordinate(idx, row.lon, row.lat) elif row.num >= 30: strong.append((idx, row.num)) geo.add_coordinate(idx, row.lon, row.lat) # 设置地图 geo.add_schema(maptype="china", is_roam=False, zoom=1.2, itemstyle_opts=opts.ItemStyleOpts(color="#000000", border_color="#1E90FF"), emphasis_label_opts=opts.LabelOpts(is_show=False), emphasis_itemstyle_opts=opts.ItemStyleOpts(color="#323c48")) # 添加数据 geo.add("弱", weak, type_='scatter', # is_selected=True, symbol_size=1, is_large=True, itemstyle_opts=opts.ItemStyleOpts(color="#1E90FF")) geo.add("中", normal, type_='scatter', # is_selected=True, symbol_size=1, is_large=True, itemstyle_opts=opts.ItemStyleOpts(color="#00FFFF")) geo.add("强", strong, type_='scatter', # is_selected=True, symbol_size=1, is_large=True, itemstyle_opts=opts.ItemStyleOpts(color="#E1FFFF")) # 关闭标签 geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) # 标题 geo.set_global_opts( title_opts=opts.TitleOpts(title="微博签到点亮中国", pos_top='top', pos_left='center'), tooltip_opts=opts.TooltipOpts(is_show=False), legend_opts=opts.LegendOpts(is_show=True, pos_left='left', orient='vertical')) # 添加依赖,scatterGL需要使用 geo.js_dependencies.add("echarts-gl") # 更改图表类型 geo.options['series'][0]['type'] = 'scatterGL' geo.options['series'][1]['type'] = 'scatterGL' geo.options['series'][2]['type'] = 'scatterGL' geo.render_notebook()
-
基于pyecharts的涟漪散点地图(Effect Scatter Map)
import pandas as pd import matplotlib.pyplot as plt import cartopy.crs as ccrs import cartopy.feature as cfeature import pandas as pd import numpy as np # 导入数据 data = pd.read_csv('https://raw.githubusercontent.com/holtzy/The-Python-Graph-Gallery/master/static/data/TweetSurfData.csv', sep=";") # 绘制气泡地图 # 初始布局 fig = plt.figure(figsize=(15,10)) # 背景地图 ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree()) ax.set_extent([-180, 180, -65, 80], crs=ccrs.PlateCarree()) ax.add_feature(cfeature.LAND, facecolor='grey', alpha=0.3) ax.add_feature(cfeature.OCEAN, facecolor='#A6CAE0') ax.add_feature(cfeature.COASTLINE, linewidth=0.1, edgecolor="white") # 根据大陆为每个点准备一种颜色 data['labels_enc'] = pd.factorize(data['homecontinent'])[0] # 每个位置添加一个点 scatter = ax.scatter( data['homelon'], data['homelat'], s=data['n']/6, alpha=0.4, c=data['labels_enc'], cmap="Set1", transform=ccrs.PlateCarree()) # 著作信息 plt.text( -175, -62,'Where people talk about #Surf\n\nData collected on twitter by @R_Graph_Gallery during 300 days\nPlot realized with Python and the Basemap library', ha='left', va='bottom', size=9, color='#555555' ) plt.show()
-
基于plotly的数据栅格化的散点地图(Rasterization Scatter Map)
import pandas as pd import datashader as ds from colorcet import fire import datashader.transfer_functions as tf import plotly.express as px # 导入数据 df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/uber-rides-data1.csv') dff = df.query('Lat < 40.82').query('Lat > 40.70').query('Lon > -74.02').query('Lon < -73.91') cvs = ds.Canvas(plot_width=1000, plot_height=1000) agg = cvs.points(dff, x='Lon', y='Lat') # 获取纬度和经度的坐标 coords_lat, coords_lon = agg.coords['Lat'].values, agg.coords['Lon'].values # 图像的角点,需要传递给mapbox coordinates = [[coords_lon[0], coords_lat[0]], [coords_lon[-1], coords_lat[0]], [coords_lon[-1], coords_lat[-1]], [coords_lon[0], coords_lat[-1]]] # 将agg图形进行着色,颜色映射采用fire配色方案,然后生成图片格式 img = tf.shade(agg, cmap=fire)[::-1].to_pil() # 绘制基于MapBox的散点图 fig = px.scatter_mapbox(dff[:1], lat='Lat', lon='Lon', zoom=12) # 将 datashader 图像添加为 mapbox 图层图像 fig.update_layout(mapbox_style="carto-darkmatter", mapbox_layers = [ { "sourcetype": "image", "source": img, "coordinates": coordinates }] ) fig.show()
总结
以上利用pyecharts绘制了散点地图和具有涟漪效应的散点地图,利用plotly绘制了具有数据栅格化的散点地图。
共勉~