之前写了一篇,
有份近10年的地震数据,你会怎样用python分析呢?
有人留言说,想要将数据显示地图上。 比如地震网上这种效果。
显示图表的库非常多,这里我们试用一个轻量级第三方 folium 库。
三行代码就可以在本地生成一个render.html地图网页文件。
代码语言:javascript复制import folium
world_map = folium.Map(location=[28.5, 100.40], zoom_start=4)
world_map.save('render.html')
详细使用可以查看其文档。
在地图指定的经纬度上标记也非常简单。选取一种标记方式即可,我这里采用圆标记。
代码语言:javascript复制folium.CircleMarker(
location=[50, 100.40],
radius=2,
popup='Laurelhurst Park',
color='#ff0000',
fill=True,
fill_color='#3186cc'
).add_to(self.world_map)
除了圆,还有很多其它形式,比如下面这种:
下面做一个GUI,将网页内嵌到里面。
根据中国大概的经纬度范围,粗略的过滤数据,通过滑动条,显示不同级别的地震点。
近十年二级以上地震效果
近十年四级以上地震效果
近十年六级以上地震效果
近十年七级以上地震效果
根据可视化的效果,大家能看出些什么吗?
完整的代码:
代码语言:javascript复制import sys
import os
from PySide2.QtWidgets import *
from PySide2.QtCore import *
from PySide2.QtWebEngineWidgets import QWebEngineView
import json
import folium
with open('earthquake1.json',encoding='utf-8') as f:
data = json.load(f)
longitudes = data['longitude']
latitudes = data['latitude']
levels = data['level']
class MyCharts(QWidget):
def __init__(self):
super().__init__()
self.resize(1500,1500)
self.V_l = QVBoxLayout()
self.h_l = QHBoxLayout()
self.label = QLabel('地震等级')
self.label2 = QLabel('0级')
self.slider = QSlider(orientation=Qt.Horizontal)
self.slider.setMinimum(1)
self.slider.setMaximum(9)
self.slider.setTickPosition(QSlider.TicksAbove)
self.slider.setTickInterval(1)
self.h_l.addWidget(self.label)
self.h_l.addWidget(self.label2)
self.h_l.addWidget(self.slider)
self.browser = QWebEngineView()
self.V_l.addWidget(self.browser)
self.V_l.addLayout(self.h_l)
self.setLayout(self.V_l)
self.show()
self.init_map()
self.init_set()
self.slider.valueChanged.connect(self.add_marker)
def init_map(self):
self.world_map = folium.Map(location=[28.5, 100.40], zoom_start=4)
self.world_map.save('render.html')
def init_set(self):
self.browser.load(QUrl.fromLocalFile(
os.path.realpath("render.html")))
def add_marker(self):
self.level = self.slider.value()
self.label2.setText(f'{self.level}级')
print(self.level,type(self.level))
self.world_map = folium.Map(location=[28.5, 100.40], zoom_start=4)
for x, y, level in zip(longitudes, latitudes, levels):
if (73.5 < float(x) < 135) and (4 < float(y) < 53.5) and float(level) > self.level:
folium.CircleMarker(
location=[y, x],
radius=2,
popup='Laurelhurst Park',
color='#ff0000',
fill=True,
fill_color='#3186cc'
).add_to(self.world_map)
self.world_map.save('render.html')
self.init_set()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MyCharts()
sys.exit(app.exec_())
代码语言:javascript复制(全文完)