Python Geo 根据经纬度和指标值画图
记录一下一天的辛酸画图历程1、Folium 热力图一开始是别人要求根据经纬度和ratio这个指标画一个热图,我就直接拿folium画了一个,还挺好看的,不过放大来看就发现,这些区域的颜色深浅一部分是根据数据密度,一部分是根据ratio的大小,而ratio的差距也不是很大,所以颜色深浅的主要因素就是各个区域点的密度,这就和要求不符,所以开始查资料。最终发现要在图上只想体现ratio值大小的话,只能根
记录一下一天的辛酸画图历程
1、Folium 热力图
一开始是别人要求根据经纬度和ratio这个指标画一个热图,我就直接拿folium画了一个,还挺好看的,不过放大来看就发现,这些区域的颜色深浅一部分是根据数据密度,一部分是根据ratio的大小,而ratio的差距也不是很大,所以颜色深浅的主要因素就是各个区域点的密度,这就和要求不符,所以开始查资料。最终发现要在图上只想体现ratio值大小的话,只能根据经纬度画散点图,然后再根据值的大小上色。这里也放一下folium 的热力图代码。
###根据经纬度画热力图
import folium
import webbrowser
from folium.plugins import HeatMap
#首先保证导入的数据框brother_ratio中有维度和经度以及ratio的数据
LAT_new = brother_ratio['LATNUM'] #纬度
LNG_new = brother_ratio['LONGNUM'] #经度
#拼接成list
data1 = [[brother_ratio['LATNUM'][i],brother_ratio['LONGNUM'][i],
brother_ratio['ratio'][i]] for i in range(len(brother_ratio))]
#计算中心点,也可以自定义
Center=[np.mean(np.array(LAT_new,dtype='float32')),np.mean(np.array(LNG_new,dtype='float32'))]
#初始化地图
m=folium.Map(location=Center,zoom_start=6)
#热力图
HeatMap(data1,radius = 15).add_to(m)
name='ratio_data.html' #文件名
m.save(name) #保存热力图文件
#将结果文件打开进行显示
webbrowser.open(name,new=2)
2、Geo 散点图
这里直接上官方文档,已经写得很清晰了:https://gallery.pyecharts.org/#/Geo/geo_base
from pyecharts import options as opts
from pyecharts.charts import Geo
from pyecharts.faker import Faker
c = (
Geo()
.add_schema(maptype="china")
.add("geo", [list(z) for z in zip(Faker.provinces, Faker.values())])
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(
visualmap_opts=opts.VisualMapOpts(), title_opts=opts.TitleOpts(title="Geo-基本示例")
)
.render("geo_base.html")
)
但是这里的 maptype="china",也就是用的是中国地图。如果需要的是其他国家的地图,也可以换成对应国家的名称。这里有个坑,我换瑞士、英国、美国等国家的都没事,但是恰恰我需要的是印度尼西亚的地图,而我把maptype="印度尼西亚",maptype="印尼"都没用。找遍全网也没有解决办法,只能去看官方文档,217 countries and regions,这里就包含了217个国家的地图资源。
别的国家都一个名字,就印尼写两个????而且切记两个名字之间要写英文的逗号加空格 ,也就是 印度尼西亚, 印尼。至此,代码就差不多了,下面贴下完整代码。
from pyecharts.charts import Geo
from pyecharts import options as opts
import pandas as pd
df = pd.read_csv('ratio.csv')
geo_cities_coords={df.iloc[i,0]:[df.iloc[i]['LONGNUM'],df.iloc[i]['LATNUM']] for i in range(len(df))}
attr=list(df.iloc[:,0])
value=list(df['ratio'])
data_pair=[(df.iloc[i,0],df.iloc[i]['ratio']) for i in range(len(df))]
geo = Geo()
geo.add_schema(maptype="印度尼西亚, 印尼")
for key,value in geo_cities_coords.items():
geo.add_coordinate(key,value[0],value[1])
# geo.add('',data_pair,symbol_size=10,itemstyle_opts=opts.ItemStyleOpts(color="blue"))
geo.add('',data_pair,symbol_size=5)
# 设置样式
# geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False),type='effectScatter')
geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False),type='scatter')
# is_piecewise 是否自定义分段, 变为true 才能生效
geo.set_global_opts(visualmap_opts=opts.VisualMapOpts(max_ = 1),
title_opts=opts.TitleOpts(title="ratio"))
geo.render()
这里有个变量要注意,opts.VisualMapOpts(max_ = 1),里面的max_默认值是100,也就是刻度的最大值。但是我的ratio最大是1,如果用默认最大值那所有点的颜色就一样了。
最终得到一个render.html文件,如下图
没有热力图好看,但目前也找不到符合要求的画法了,如果有大佬知道更好的方法请指教。
参考文献
更多推荐
所有评论(0)