【问题标题】:Plotting Satellite data and coastlines using Matplotlib and Cartopy使用 Matplotlib 和 Cartopy 绘制卫星数据和海岸线
【发布时间】:2022-03-17 01:20:45
【问题描述】:

我正在尝试将来自 DSCOVR 卫星的数据绘制到正交投影上,并将海岸线添加到图像中。我正在使用 Matplotlib 和 cartopy。我可以显示海岸线或数据,但不能同时显示。我怀疑问题的一部分是纬度和经度数据包括黑暗区域(地球周围的空间)并被赋予值 -999.0。

数据可在以下位置找到: https://asdc.larc.nasa.gov/data/DSCOVR/EPIC/L2_CLOUD_03/2021/12/ 该目录中的任何文件都可以使用。

这是我的代码:

import cartopy.crs as ccrs
import h5py
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
import numpy as np


filename = 'DSCOVR_EPIC_L2_CLOUD_03_20211203163932_03.nc4'

def make_cloud_image(cloud_name):
    cloud = h5py.File(filename, 'r')
    cloud_data = np.array(cloud['geophysical_data/Cloud_Mask'])
    lat_data = np.array(cloud['geolocation_data/latitude'])
    lon_data = np.array(cloud['geolocation_data/latitude'])
    lat = cloud.attrs.__getitem__('centroid_mean_latitude')[0]
    lon = cloud.attrs.__getitem__('centroid_mean_longitude')[0]
    projection = ccrs.Orthographic(central_longitude=lon, central_latitude=lat, globe=None)    
    ax = plt.subplot(projection=projection)
    cmap = ListedColormap(["Black","dodgerblue", "lightblue", "lightyellow", "white"])
    ax.pcolormesh(lat_data,lon_data, cloud_data, cmap=cmap, transform=projection)
    ax.annotate(cloud_name[-30:-4],xy=(.5,.90),xycoords='axes fraction',
                color='white',fontsize=6, horizontalalignment='center')
    ax.set_global()
    plt.axis('off')
    ax.coastlines()

    plt.show
    

make_cloud_image(filename)

【问题讨论】:

  • 你试过转换that worked for this question吗?我也会尝试改变你想要的 z 顺序,或者任何一个 z 顺序,这取决于。我会在这个非常整洁的示例中自己尝试一下,但我在安装 cartopy 时遇到了麻烦。
  • @cphlewis 您需要在安装 Cartopy 之前安装 GEOS。 libgeos.org 从问题中添加转换有点帮助。我可以看到在海岸线上绘制的少量数据。
  • @Marshall Sutton,你还在做这个吗?如果是这样,请说明您如何获得“可以绘制海岸线或数据,但不能同时绘制两者”。我只能获取海岸线,但ax.pcolormesh() 不显示数据。你是如何绘制数据的?我可以用plt.imshow(cloud_data) 绘制图像数据。如果使用_FillValue屏蔽云数据,显示效果会更好。
  • @kcw78 我使用了上面评论中的转换。我还必须将所有非地球像素归零。它们被设置为 -999 的值。将它们设置为零值似乎可以解决问题。这是我最新的解决方案。

标签: python matplotlib cartopy


【解决方案1】:

@kcw78,我不得不将非地球像素归零,因为它们被设置为“-999”的值,我还使用了之前评论中建议的变换。

#import cartopy.crs as ccrs

import h5py
import os, sys
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from matplotlib.patches import Patch
import numpy as np
import cartopy.crs as ccrs

filename = 'DSCOVR_EPIC_L2_CLOUD_03_20211203163932_03.nc4'
fontsiz = 6



def make_cloud_image(cloud_name):
    cloud = h5py.File(filename, 'r')
    data = np.array(cloud['geophysical_data/Cloud_Mask'])
    data_where = np.where(data==0,np.nan,data)
    lat_data = np.array(cloud['geolocation_data/latitude'])
    lat_where = np.where(lat_data==-999.0,0,lat_data)
    lon_data = np.array(cloud['geolocation_data/longitude'])
    lon_where = np.where(lon_data==-999.0,0,lon_data)
    lat = cloud.attrs.__getitem__('centroid_mean_latitude')[0]
    lon = cloud.attrs.__getitem__('centroid_mean_longitude')[0]
    lon_min = cloud.attrs.__getitem__('minimum_longitude')[0]
    lat_min = cloud.attrs.__getitem__('minimum_latitude')[0]    
    lon_max = cloud.attrs.__getitem__('maximum_longitude')[0]
    lat_max = cloud.attrs.__getitem__('maximum_latitude')[0]
    projection=ccrs.Orthographic(central_longitude=lon, central_latitude=lat,globe=None)
    
    ax = plt.subplot(projection=projection)
        
    cmap = ListedColormap(["dodgerblue", "lightblue", "lightyellow", "white"])
    plt.pcolormesh(lon_where,lat_where,data_where, cmap=cmap, transform=ccrs.PlateCarree(), zorder=2)
                     
    ax.coastlines(zorder=3)
    
    plt.savefig(f'{filename[:-4]}.png')
    
make_cloud_image(filename)

【讨论】:

  • 我运行了您的代码,它生成了一张带有海岸线的图像。所以,你解决了你的问题,对吧?
  • 是的,代码有效,我有我需要的图像。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-19
  • 2020-07-24
  • 1970-01-01
相关资源
最近更新 更多