🎯要点
- 算法区分不同水循环数据类型:地下水、河水、降水、气温和其他,并使用相应标准化降水指数、标准化地下水指数、标准化河流水位指数和标准化降水蒸散指数。
- 绘制和计算特定的时间序列比较统计学相关性。
- 使用相关矩阵可视化集水区和显示空间信息。
🍪语言内容分比
🍇Python地图表示
Altair 是一个基于 Vega 和 Vega-Lite(来自 JS)的声明式图形可视化库,而 Vega 和 Vega-Lite 又基于 D3.js。它允许将交叉地图与其他类型的图形相关联,如以下示例所示:
import altair as alt
url_geojson = 'mallorca_geoson.json'
data_geojson = alt.Data(url=url_geojson, format=alt.DataFormat(property=' features',type='jjson'))
mallorca = alt.Chart(data_geojson).mark_geoshape(stroke="gray", color="white", strokeWidth=0.5)
#D Data
coord_mask = (pluvio.COORD_X >= 2.2) & (pluvio.COORD_X <= 3.5)&\
(pluvio.COORD \overline{Y}>=38.\theta)&(pluvio.COORD_
mallorca_pluvio = pluvio.\्रoc[coord_mask, : ]
#Plots
brush = alt.selection_interval(encodings=["longitude", "latitude"], empty=False)
pluviometros = alt.Chärt(mallorca_pluvio) \
.mark circle(size=50)\
.encode(
longitude =' COORD X:Q',
latitude='COORD \Y:Q',
tooltip=['NOMBRE:N', 'ALTITUD:Q'],
color=alt.condition(brush, alt.value("red"), alt.value("lightgray"))
) \
.project("equalEarth") \
.properties(width=500, height=350) \
. add params(brush)
bars = alt.Chart(mallorca_pluvio) \
.mark_bar() \
.encode(
x=alt.X("ALTITUD:Q"),bin(extent=[0,700]),
y=" count (ALTITUD):0",
color=alt.value("steelblue")
)
left_map = mallorca + pluviometros
bars_overlay = bars.encode(color=alt.value("red")).transform_filter(brush)
right bars = alt. layer(bars, bars_overlay)
left_map | (bars + right_bars)
为简洁起见,下面仅使用 2013 年的数据为每种车辆类型生成一张图表。
import altair as alt
# Base chart
url_geojson = 'mallorca_geoson.json'
data_geojson = alt. Data(url=url_geojson, format=alt.DataFormat(property='features',type='json'))
mallorca = alt.Chart(data_geojson), mark_geoshape(stroke="gray", strokeWidth=0.2)
data = data. loc[data. year == 2013, :]
options = ["cars", "scooters", "motorbikes", "vans", "trucks"]
mallorca \
.transform_lookup(
lookup="properties, neighbourhood",
from_alt.LookupData(data=data, key="municipality", fields=["municipality"] + vehic)
) \
.encode(
alt.Color(alt, repeat('row'), type='quantitative'),
tooltip=["municipality:N", alt.Tooltip(alt.repeat('row'), type='quantitative')]) \
.project(type="equalEarth") \
.properties(width=400, height=200) \
.repeat(row=options) \
.resolve_scale(color='independent')
Plotly 允许以与 Altair 提供的类似交互的方式表示地图,此外还可以通过 mapbox API 访问 Carto 和 OpenStreet 地图。
import plotly.express as px
fig = px.scatter_mapbox(pluvio,
lat=pluvio. COORD Y,
lon=pluvio.COORD_X,
hover_name="NOMBRE",
hover data="ALTITUD",
mapbox_style="carto-positron",
center={"lat": 39.5, "lon": 2.85},
zoom=8)
fig.show()
下面的交互式地图与 Dash 集成,包含额外的交互,可让您探索多年来不同车辆的数量。
import json
from dash import Dash, dcc, html, Input, Output
with open('mallorca_geoson.json') as file:
mallorca_geoson = json.load(file)
app = Dash (__name__)
app.layout = html.Div([
html.H4('Vehicles per 1000 inhab.'),
html.P("Select a vehicle:"),
dcc.RadioItems(
id='mapbox-mallorca geoson-choropleth-x-vehicle',
options=["cars", "scooters", "motorbikes", "vans", "trucks"],
value="cars",
inline=True
),
dcc.Graph(id="mapbox-mallorca geoson-choropleth-x-graph"),
])
@app.callback(
Output("mapbox-mallorca_geoson-choropleth-x-graph", "figure"),
Input("mapbox-mallorca_geoson-choropleth-x-vehicle", "value"))
def display choropleth(vehicle):
fig = px.choropleth_mapbox(
data, geojson=mallorca_geoson, color=vehicle,
color continuous scale="Viridis",
locatīons="municípality",
featureidkey="properties.neighbourhood",
center={"lat": 39.5, "lon": 2.85},
zoom=7.5,
animation_frame="year"
)
fig.update_layout(
margin={"r":0,"tt":\theta,"l":0,"b":0},
mapbox_accesstoken=token
)
return fig
if __name___= "__main__":
app.run_server (debug=True)
Bokeh 是一个用于创建交互式 JS 可视化的 Python 库,它不基于 D3.js。如果 Plotly 与包含 Flask Web 服务器的 Dash 集成,那么 Bokeh 则使用 Tornado Web 服务器,后者在后端使用 WebSockets。WebSockets 是有状态的且异步的。
from bokeh.io import output_file, show, output_notebook
from bokeh.layouts import column
from bokeh.models import WMTSTileSource, ColumnDataSource, LinearColorMapper, ColorBar, Select, I
HoverTool, PrintfTickFormatter
from bokeh.models.widgets import RadioButtonGroup
from bokeh.palettes import Viridis6
from bokeh.plotting import figure, show
from numpy import pi, tan, log
import json
output notebook()
def transform_to_mercator(data, lat, lon):
k=637813
data["x"] = data[lon] * k * pi / 180.
data["y"] = log(tan((90 + data[lat]) * p1 / 360.)) * k
return data
bokeh_pluvio = transform_to_mercator(pluvio, "COORD_Y", "COORD_X")
x_range, y_range = ((250000, 390000), (4750000, 4850000))
tooltips = [("Name", "@NOMBRE"), ("Altitud", "@ALTITUD"), ("(Lon, Lat)", "($x, $y)")]
source = ColumnDataSource(data=bokeh_pluvio)
hover = HoverTool(tooltips=tooltips)
p = figure(
tools="pan, wheel_zoom, hover, reset",
x_range =x_range,
y_range=y_range,
x_axis_type="mercator",
y_axis_type="mercator",
)
p.circle(source=source, fill_color="blue", size=10)
url="http://a.basemaps.cartocdn.com/rastertiles/voyager/{Z}/{X}/{Y}.png"
attribution = "Credit: Carto, under CC BY 3.0. Data by OSM, under ODbL"
p.add_tile(WMTSTileSource(url=url, attribution=attribution))
show(p)