全球空气质量图(绘图环节改进)

在前文 爬虫+matplotlib绘制全球空气质量图 中,绘制的AQI图如下:

AQI图

该图存在以下问题:

1、采样数量不足导致构造的矩阵中零值过多,整体偏暗。

2、绘制点过于离散,色块分布不均匀。

3、绘制图形没有世界地图作为背景,可视化效果欠佳。

本文解决如下——》


1、问题一:

提高分辨率,增加爬取点数量——》

#15 degrees per grid 
lat_lower = np.arange(-90, 90, 15)
lat_upper = lat_lower + 15
long_lower = np.arange(-180, 180, 15)
long_upper = long_lower + 15

# base query
query_base = "https://api.waqi.info/mapq/bounds/?bounds="

# list of our queries
queries = []

# create queries
for i in range(12):  # loop over lat
    for j in range(24):  # loop over long
        bounds = "%d,%d,%d,%d" % (lat_lower[i], long_lower[j],
                                  lat_upper[i], long_upper[j])
        query = query_base + bounds
        queries.append(query)

创建 12×24=288 个URL,开始爬数据——》

import time

# create a list to contain all data
all_data = []

# run querie
for query in queries:
    data = requests.get(query)
    data_json = data.json()

    # add results to our list
    all_data.extend(data_json)

    # pause for 0.5 seconds (max 120 queries per minute)
    time.sleep(0.5)

# check length
print("Obtained %d records" % len(all_data))

结果如下:

Obtained 4906 records

共爬取4906个采样点。


2、问题二:

首先绘制矩阵——》

from numpy import linspace
from numpy import meshgrid

#横纵坐标分块
m_lat = linspace(-90, 90, 900)
m_lon = linspace(-180, 180, 1800)

#clean data
df = pd.DataFrame.from_dict(all_data)
df_clean = df[pd.to_numeric(df['aqi'], errors='coerce').notnull()]
lat = np.array(df_clean['lat'], dtype='f')
lon = np.array(df_clean['lon'], dtype='f')
aqi = np.array(df_clean['aqi'], dtype='f')

#构造矩阵
lat_s = 5 * (lat + 90)
lon_s = 5 * (lon + 180)
lat_s = lat_s.astype(int)
lon_s = lon_s.astype(int)
xx, yy = np.meshgrid(m_lon, m_lat)
arr = np.zeros((900, 1800))
for i in range(len(lat)):
    arr[lat_s[i], lon_s[i]] = aqi[i]

构造出一个900行、1800列的矩阵,矩阵内坐标为 (lat_s[i], lon_s[i]) 的元素值为aqi[i]。


3、问题三:

使用basemap绘制世界地图——》

from mpl_toolkits.basemap import Basemap

#draw a map
fig, ax = plt.subplots(figsize=(10,6))
m = Basemap(projection='cyl', ax=ax)
m.fillcontinents(color='grey',lake_color='white',alpha=0.2)
m.drawmapboundary(fill_color='black')

地图配色选择的有些暗:

world map

进行高斯滤波,并绘制采样点、图题及色柱——》

import scipy.ndimage as sng

#plotting
arr_sng = sng.filters.gaussian_filter(arr, sigma=4)
arr_sng = np.log(arr_sng + 1)
imap = ax.pcolor(xx, yy, arr_sng, cmap='hot')
cax = fig.add_axes([0.3, 0.05, 0.4, 0.03])
fig.colorbar(imap, orientation="horizontal", cax=cax)
plt.title('AQI MAP')
plt.show()

最终绘制结果如下——》

最终AQI图

总结:

本文对文章 爬虫+matplotlib绘制全球空气质量图 中绘图环节作了如下工作:

1、提高分辨率,细化URL中经纬度边界的划分,增加爬取数量。

2、构造更大规模矩阵,将经纬度绘制精度提高到0.2度。

3、使用basemap绘制背景图。

3、使用高斯滤波降低离散效果。

4、使用log函数提高亮度。

5、使用pcolor绘制采样点。

你可能感兴趣的:(全球空气质量图(绘图环节改进))