美文网首页
全球空气质量图(绘图环节改进)

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

作者: 少年皓 | 来源:发表于2018-12-12 14:11 被阅读0次

    在前文 爬虫+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绘制采样点。

    相关文章

      网友评论

          本文标题:全球空气质量图(绘图环节改进)

          本文链接:https://www.haomeiwen.com/subject/nknuhqtx.html