先看效果
原始数据
代码
有注释,这里就不再叙述,直接上代码
init
import util as util
import config as config
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文
def get_data_config(path):
if str(path).find("LV1") >= 0:
return config.data_dic.get("LV1")
else:
return config.data_dic.get("LV2")
def find_height_layer(data):
"""
获得数据高度信息
:param data:
:return:
"""
height_layer = []
for i in data:
height_layer.append(util.get_number(i))
return height_layer
def find_type_data(data, data_type_number, column_localhost):
"""
根据类型过滤一遍数据
:param data:
:param data_type_number:
:return:
"""
tmp_data = []
time_data = []
for i in data:
if i[2] == data_type_number:
tmp_data.append(i[column_localhost:])
time_data.append(i[1][11:16])
# .transpose() 矩阵xy翻转
return np.array(tmp_data, dtype=float).transpose(), time_data
def figure(ynew, xnew, grid_data, unit, name, bar_lab, level, contour_level, fmt):
"""
绘图
:param ynew:高度
:param xnew:时间
:param grid_data: 数据
:param unit: 单位
:param name: 变量名称
:param bar_lab: 色阶显示的标签值
:param level: 色阶等级
:return:
"""
img = plt.figure()
ax = img.add_subplot(111)
# 色斑图
p = plt.contourf(ynew, xnew, grid_data, levels=level, cmap='jet')
# 等值线
contour = plt.contour(ynew, xnew, grid_data, contour_level, colors='k', linewidths=0.3)
plt.clabel(contour, fmt=fmt, fontsize=10, colors='k')
cbar = plt.colorbar(p)
# 设置色阶显示标签
cbar.set_ticks(bar_lab)
# 单位
cbar.ax.set_title(unit)
# 设置x轴刻度显示数量
ax.set_xticks(ax.get_xticks()[::30])
# 设置x轴显示标签
ax.set_xticklabels(config.x_time)
# 标签旋转90度
plt.xticks(rotation=90)
plt.xlabel("时间")
plt.ylabel("高度(km)")
plt.title(name)
# plt.savefig(data_type_number + ".png", dpi=500)
plt.show()
path = '/ZP2020-06-02_00-00-59LV2.csv'
data_type_number = config.data_type_number
data_config = get_data_config(path)
column_localhost = data_config.get("column_localhost")
height_layer_localhost = data_config.get("height_layer_localhost")
unit = data_config.get("data_type").get(data_type_number).get("unit")
name = data_config.get("data_type").get(data_type_number).get("name")
bar_lab = data_config.get("data_type").get(data_type_number).get("bar_lab")
color_level = data_config.get("data_type").get(data_type_number).get("color_level")
contour_level = data_config.get("data_type").get(data_type_number).get("contour_level")
fmt = data_config.get("data_type").get(data_type_number).get("fmt")
data_arr = util.red_csv(path)
height_layer = find_height_layer(data_arr[height_layer_localhost][column_localhost:])
tmp_data, time_data = find_type_data(data_arr, data_type_number, column_localhost)
figure(time_data, height_layer, tmp_data, unit, name, bar_lab, color_level, contour_level, fmt)
print(1)
util
import csv
import re
def get_number(str):
pat = '\d+\.\d+|\d+\.|\.\d+|\.'
number = re.findall(pat, str)[0]
return float(number)
def red_csv(path):
"""
读取数据
:param path:
:return:
"""
data_arr = []
with open(path, encoding='gbk')as f:
f_csv = csv.reader(f, skipinitialspace=True)
for row in f_csv:
data_arr.append(row)
return data_arr
config
import numpy as np
# data_type_number 数据类型
# column_localhost 多少列开始是通道(不同高度层)数据
data_type_number = "11"
data_dic = {
"LV1": {"data_type": {"11": "大气辐射亮温", "21": "温、湿、压、红外、降雨"}, "column_localhost": 3, "height_layer_localhost": 1},
"LV2": {
"data_type": {
"11": {"name": "温度廓线", "unit": "(℃)", "bar_lab": np.linspace(-50, 50, 6), "color_level": np.linspace(-50, 50, 500), "contour_level":[-40,-30,-20,-10,0,10,20],"fmt":'%.0f'},
"12": {"name": "水汽浓度廓线", "unit": "(%)", "bar_lab": np.linspace(0, 15, 6), "color_level": np.linspace(0, 15, 500), "contour_level":[0.1,0.2,0.3,0.5,1,2,3,5,7,9,11,13,15],"fmt":'%.1f'},
"13": {"name": "相对湿度廓线", "unit": "(%)", "bar_lab": np.linspace(0, 100, 6), "color_level": np.linspace(0, 100, 500), "contour_level":[20,30,40,50,60,70,80,90,100],"fmt":'%.0f'},
"14": {"name": "液态水廓线", "unit": "(mm)", "bar_lab": np.linspace(0, 0.55, 6),"color_level": np.linspace(0, 0.55, 500), "contour_level":[0.1,0.2,0.3,0.4,0.5],"fmt":'%.1f'},
"21": "卫星数据"},
"column_localhost": 11, "height_layer_localhost": 0}
}
x_time = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18",
"19", "20", "21", "22", "23"]