今天小编带大家绘制一幅”颜值“超高的学术图表,起初原因也是群里的小伙伴询问怎么绘制。要知道我可是非常宠读者的哈~~绝对的安排!读者给出的图片如下:
读者询问的图片
小编第一眼也被这副作品吸引了,但立马想到这可能是使用MATLAB进行绘制的,而且数据也是地理信息专业相关的图表。要想完美复现这副作品则需要解决以下两个问题:
- 如何找到可替代的数据?
- Python/R如何使用MATLAB的colormap?
针对以上问题,我们分步骤解决,具体内容如下:
如何找到可替代的数据及处理?
在咨询完交流群中的相关专业大佬后,得出这种数据可能是NC网格数据,取不同维度数据进行绘制即可。小编研究生期间处理过葵花卫星nc网格数据,前一段时间也有其他同学咨询Python处理nc数据的问题,这次就简单说一下哈,内容如下:
Python-netCDF4库处理nc数据
在选择完使用葵花卫星nc数据进行绘制后,我们使用Python-netCDF4库 进行nc格式数据的处理(这里仅介绍读取和数据维度选择)。
代码语言:javascript复制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()读取数据结果
本期实例所涉及到的处理代码如下:
代码语言:javascript复制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进行绘制,如下:
代码语言:javascript复制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颜色系进行绘制,如下:
代码语言:javascript复制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)格式的数据进行绘制。
图表美化
接下来我们对已经绘制的图表结果进行优化,所使用的方法我们在之前的直播中也说了很多遍,具体绘制方法如下:
代码语言:javascript复制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
「注意」:这里的经纬度数据只是对点数进行计数,使用:
代码语言:javascript复制ax.set_yticklabels(labels = [-10, 40, 30, 20, 10])
进行图表刻度的自定义设置。我们再来看看其他维度数据的可视化结果:
Tbb_11
SAZ
此外,我们也使用了Matplotlib的Spectral_r颜色系进行绘制,结果如下:
SOA with Spectral_r
总结
今天的推文小编主要介绍了:
- NC网格数据的读取;
- MATLAB默认parula颜色系的Matplotlib绘制;
- Matplotlib的colorbar的定制化绘制。
接下来的推文中,小编将使用pcolormesh() 和contour() 方法进行空间(X,Y,Z)学术图表的绘制。
参考资料
[1]
Python-netCDF4官网: http://unidata.github.io/netcdf4-python/。
喜欢就点个 在看 呗