在前文 爬虫+matplotlib绘制全球空气质量图 中,绘制的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')
地图配色选择的有些暗:
进行高斯滤波,并绘制采样点、图题及色柱——》
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()
最终绘制结果如下——》
总结:
本文对文章 爬虫+matplotlib绘制全球空气质量图 中绘图环节作了如下工作:
1、提高分辨率,细化URL中经纬度边界的划分,增加爬取数量。
2、构造更大规模矩阵,将经纬度绘制精度提高到0.2度。
3、使用basemap绘制背景图。
3、使用高斯滤波降低离散效果。
4、使用log函数提高亮度。
5、使用pcolor绘制采样点。