分享

超详细!空间学术网格数据绘制,配色超赞!!

 汉无为 2022-01-10

点击上方“DataCharm”,选择“星标公众号

图片

今天小编带大家绘制一幅”颜值“超高的学术图表,起初原因也是群里的小伙伴询问怎么绘制。要知道我可是非常宠读者的哈图片图片~~绝对的安排!读者给出的图片如下:

图片
读者询问的图片

小编第一眼也被这副作品吸引了,但立马想到这可能是使用MATLAB进行绘制的,而且数据也是地理信息专业相关的图表。要想完美复现这副作品则需要解决以下两个问题:

  • 如何找到可替代的数据?
  • Python/R如何使用MATLAB的colormap?

针对以上问题,我们分步骤解决,具体内容如下:

如何找到可替代的数据及处理?

在咨询完交流群中的相关专业大佬后,得出这种数据可能是NC网格数据,取不同维度数据进行绘制即可。小编研究生期间处理过葵花卫星nc网格数据,前一段时间也有其他同学咨询Python处理nc数据的问题,这次就简单说一下哈,内容如下:

Python-netCDF4库处理nc数据

在选择完使用葵花卫星nc数据进行绘制后,我们使用Python-netCDF4库 进行nc格式数据的处理(这里仅介绍读取和数据维度选择)。

import numpy as np
import pandas as pd
from netCDF4  import Dataset

nc_file = 'NC_H08_20191111_0300_R21_FLDK.06001_06001.nc'
nc_data = Dataset(nc_file)

使用Dataset()函数即可读取,读取结果如下:

图片
Dataset()读取数据结果

本期实例所涉及到的处理代码如下:

data_list = ['albedo_01','albedo_02','albedo_03','albedo_04','tbb_11','tbb_12','tbb_13','SAZ']
lat = 39.933
lon = 116.317

Xi = int(np.floor((60-lat)/ 0.02))
Yi = int(np.floor((lon-80)/ 0.02)) 

dicData = {key: value[:].data for key, value in nc_data.variables.items() if key in data_list}
data = {key: value[Xi,Yi] for key, value in dicData.items() if key in data_list}
# 获取40x40的网格数据
data_tif = {key: value[Xi-20:Xi+20,Yi-20:Yi+20] for key, value in dicData.items()}
band1 = data_tif.get('albedo_01')

以上即可获取我们随需要绘制的数据,注意:这里我们给出经纬度信息,获取以这个经纬度点周围40x40的数据。

以上就解决了我们数据来源问题,也顺带说了下nc数据的python读取方法,更过关于Python处理nc格式数据可在我直播的时候进行详细介绍或者参考:Python-netCDF4官网[1]

Python/R如何使用MATLAB的colormap?

获取parula颜色系

这里我们首先使用Python-Matplotlib进行图表绘制,首先要解决的就是设计出MATLAB的默认colormap-parula。这里可以自行进行颜色设计,也可以通过小编分享的colormaps.py文件进行获取(获取方式见文末)。

首先,我们使用默认的Matplotlib默认的colormap进行绘制,如下:

import matplotlib.pyplot as plt
max_v = band1.max()
min_v = band1.min()

fig,ax = plt.subplots(figsize=(5,4),dpi=100,facecolor='w')
ax.imshow(band1)
pcm = ax.imshow(band1)
fig.colorbar(pcm,ax=ax,aspect=10)

图片

Python-matplotlib默认colormap

接下来,我们使用colormaps.py文件中的parula颜色系进行绘制,如下:

import matplotlib.pyplot as plt
from colormaps import parula
cmap = parula
fig,ax = plt.subplots(figsize=(5,4),dpi=100,facecolor='w')
pcm = ax.imshow(band1,cmap=cmap,)
fig.colorbar(pcm,ax=ax,aspect=10)

图片

Python-matplotlib parula colormap

注意:大家可能发现,这里使用ax.imshow() 方法进行绘制,因为我们所获取的数据为二维数组格式。我们下期在使用(X,Y,Z)格式的数据进行绘制。

图表美化

接下来我们对已经绘制的图表结果进行优化,所使用的方法我们在之前的直播中也说了很多遍,具体绘制方法如下:

import matplotlib.pyplot as plt
from colormaps import parula

plt.rcParams['font.family'] = 'Times New Roman'
cmap = parula

fig,ax = plt.subplots(figsize=(5,4),dpi=100,facecolor='w')
pcm = ax.imshow(band1,cmap=cmap,vmax=max_v,vmin=min_v)
ax.tick_params(labelsize=20)
ax.set_xticks(np.arange(0, 40, step=10))
ax.set_yticklabels(labels = [-10, 40, 30, 20, 10])
for text in ax.get_xticklabels()+ax.get_yticklabels():
    text.set_fontweight('bold')
ax.set_xlabel('longitude',fontsize=22,fontweight='bold')
ax.set_ylabel('latitude',fontsize=22,fontweight='bold')
print(ax.get_yticks())
print(ax.get_xticks())

cb = fig.colorbar(pcm,ax=ax,aspect=10)
#cb.outline.set_visible(False)
cb.ax.tick_params(direction='in',labelsize=15)
for t in cb.ax.get_yticklabels():
     t.set_fontweight('bold')
# 添加文本信息
ax.text(.5,1.04,'Albedo01',transform = ax.transAxes,fontsize=20,fontweight='bold',ha='center',va='center')

图片

Albedo01

「注意」:这里的经纬度数据只是对点数进行计数,使用:

ax.set_yticklabels(labels = [-10, 40, 30, 20, 10])

进行图表刻度的自定义设置。我们再来看看其他维度数据的可视化结果:

图片

Tbb_11

图片

SAZ

此外,我们也使用了Matplotlib的Spectral_r颜色系进行绘制,结果如下:

图片

SOA with Spectral_r

练习数据获取

整理不易,感谢大家帮忙分享,关注本公众号(DataCharm)然后在公众号后台发送 nc网格数据 即可免获取colormaps.py文件和nc练习数据。

总结

今天的推文小编主要介绍了:

  • NC网格数据的读取;
  • MATLAB默认parula颜色系的Matplotlib绘制;
  • Matplotlib的colorbar的定制化绘制。

接下来的推文中,小编将使用pcolormesh()contour() 方法进行空间(X,Y,Z)学术图表的绘制。

如果在看过100,我们直接安排直播教学教程!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多