我们有一个中国各省份的数据集,要求绘制地图热力图,该怎么实现呢?
部分数据集如下:
最后两列表示经纬度。
特别提醒:文中尽量不用世界、全国地图,能用表格表达的尽量用表格表达!
如果一定要用,凡涉国界图件(国内部分地区、全国、世界部分地区、全球)必须使用国家测绘局地理信息局标准地图底图,所用底图边界要完全无修改(包括南海诸岛位置),为适应排版时图的缩放,比例尺一律用线划比例尺,而不用数字比例尺。
并在图题下注明“注:该图基于国家测绘地理信息局标准地图服务网站下载的审图号为GS(2016)xxxx 号的标准地图制作,底图无修改。”。
编辑部的核心要求是:使用国家测绘局地理信息局标准地图底图,所用底图边界要完全无修改。并未要求提供审图号,因此我们无需提交审图,只需按这条要求提供地图即可。
我认为,要想满足这个要求,需要做到以下几点:
(1)shapefile地图为官方提供。这样可以保证地图边界无误,坐标系无误。
(2)使用EPS格式的标准地图作为底图。EPS格式标准地图中的各项要素均可编辑,可以删除不需要的文字图层,可以改变色块填充的颜色、样式,同时可以保证出图清晰。
(3)将shapefile地图调整为投影坐标系,导出为EPS格式,叠加在不改变行政边界的标准地图上。
【能不用尽量不要用!】
# 创建Basemap对象
map = Basemap(llcrnrlon=75, llcrnrlat=15, urcrnrlon=135, urcrnrlat=55, projection='lcc', lat_1=33, lat_2=45, lon_0=105, resolution='l')
# 绘制海岸线、边界和国家
map.drawcoastlines()
map.drawcountries()
map.drawstates()
# 填充地图背景颜色
map.fillcontinents(color='lightgray', lake_color='white')
# 绘制经纬线
map.drawparallels(range(-90, 91, 10), labels=[1, 0, 0, 0], fontsize=10, linewidth=0.5, color='gray')
map.drawmeridians(range(0, 360, 10), labels=[0, 0, 0, 1], fontsize=10, linewidth=0.5, color='gray')
# 将经纬度转换为Basemap坐标
x, y = map(data['long'].values, data['lat'].values)
map.scatter(x, y, c=data['value'], cmap='hot_r', s=100, alpha=0.8)
# 添加颜色条
plt.colorbar(label='Value')
plt.title('Heatmap of Values in China')
plt.show()
这段代码使用了Basemap库来创建一个地图对象,并在地图上绘制了中国地区的热力图。
首先,创建了一个Basemap对象,指定了地图的经纬度范围(llcrnrlon, llcrnrlat, urcrnrlon, urcrnrlat),投影方式(projection)为兰勃特投影(‘lcc’),中心经纬度(lon_0)为105,以及分辨率(resolution)为低分辨率(‘l’)。
接下来,使用Basemap对象的方法绘制了海岸线、边界和国家的轮廓,使用了drawcoastlines()、drawcountries()和drawstates()方法。
然后,使用fillcontinents()方法填充地图的陆地颜色为灰色,水域颜色为白色。
接着,使用drawparallels()和drawmeridians()方法绘制经纬线,设置了经纬线的范围、标签位置、字体大小、线宽和颜色。
之后,将经纬度坐标转换为Basemap坐标,使用scatter()方法在地图上绘制散点图,其中x和y分别表示经纬度坐标转换后的Basemap坐标,c表示散点的颜色,s表示散点的大小,alpha表示散点的透明度。
最后,使用colorbar()方法添加颜色条,指定了颜色条的标签(label),并使用title()方法设置地图的标题。最后使用show()方法显示地图。
展示的结果为:
from pyecharts import options as opts
from pyecharts.charts import Map
lst1 = []
lst2 = []
for i in range(len(data)):
lst1.append(data.iloc[i, 1])
lst2.append(int(data.iloc[i, 2]))
c = (
Map(init_opts=opts.InitOpts(width = "1600px", height = "800px"))
.add("城市", [list(z) for z in zip(lst1, lst2)], "china")
.set_global_opts(
title_opts=opts.TitleOpts(title = "中国产业)"),
visualmap_opts=opts.VisualMapOpts(max_ = 60000, is_piecewise=True,
pieces=[
{"min": 0, "max": 10000, "label": "0-10000", "color": "#FFB6C1"},
{"min": 10000, "max": 20000, "label": "10000-20000", "color": "#FF6666"},
{"min": 20000, "max": 30000, "label": "20000-30000", "color": "#FF6600"},
{"min": 30000, "max": 40000, "label": "30000-40000", "color": "#FF0000"},
{"min": 40000, "max": 100000, "label": "40000-100000", "color": "#990033"}
])
)
.render("产业.html")
)
这段代码使用了pyecharts库来创建一个中国地图,并将数据中的城市和产业值添加到地图上。
首先,创建了两个空列表lst1和lst2,用于存储数据中的城市名称和产业值。
然后,通过循环遍历数据中的每一行,将城市名称和产业值分别添加到lst1和lst2中。其中,data.iloc[i, 1]表示数据中第i行的第2列(城市名称),data.iloc[i, 2]表示数据中第i行的第3列(产业值)。
接下来,导入所需的库和模块,并创建一个Map对象c。在Map对象的初始化参数中,设置了地图的宽度和高度为"1600px"和"800px"。
然后,使用add()方法将数据添加到地图中。其中,通过列表解析生成了城市和产业值的二维列表,[list(z) for z in zip(lst1, lst2)]表示将lst1和lst2中对应位置的元素打包成元组,并转换为列表。"china"表示地图的区域范围为中国。
接着,使用set_global_opts()方法设置全局配置项。title_opts用于设置地图的标题,visualmap_opts用于设置视觉映射选项。在visualmap_opts中,max_指定了视觉映射的最大值,is_piecewise=True表示视觉映射为分段模式,pieces列表用于设置分段的取值范围、标签和颜色。
最后,使用render()方法将地图渲染为HTML文件,并指定文件名为"产业.html"。
执行以上代码后,将生成一个名为"产业.html"的HTML文件,其中包含了中国地图以及对应城市的产业值颜色映射。