参数用于绘制等高线图并保存下来
map_x_data, map_y_data, map_z_data:绘制等高线图的三列数据
levels:等高线距元组或列表
start_x,start_y,end_x,end_y,step_x,step_y: x、y轴的最小值、最大值和步长
以我的理解,plt.contour就是将画布划分为若干个均匀分布的网格,按每个网格都代表的值绘制出等高线。
x_grid、y_grid生成长度为50的数组,使用np.meshgrid将他俩转变成坐标系上的每个点,X保存了网格上的所有点的x值,是一个二维数组,将x_grid按行复制,Y保存了网格上的所有y值,是一个二维数组,将x_grid按列复制。
使用rbf进行三次式拟合,这里kind还可以选择linear,quintic。看哪个效果好。将网格化的XY带入三次式func得到Z,也就是每个网格代表的值。带入到contour就可以绘制等高线了。
import matplotlib.pyplot as plt
from pylab import mpl
from matplotlib import cm
import numpy as np
import pandas as pd
import seaborn as sns
from scipy.interpolate import Rbf
def contour_f(map_x_data, map_y_data, map_z_data,levels,start_x,end_x,step_x, start_y, end_y, step_y,save_path):
plt.clf()
plt.figure(figsize=(16, 9))
x_grid=np.linspace(map_x_data.min(),map_x_data.max(),50)
y_grid=np.linspace(map_y_data.min(),map_y_data.max(),50)
X, Y = np.meshgrid(x_grid, y_grid)
func = Rbf(map_x_data, map_y_data, map_z_data, function='cubic')
Z = func(X, Y)
# 绘制图层
cset = plt.contourf(X, Y, Z, cmap=plt.cm.jet)
# 绘制等高线
contour = plt.contour(X, Y, Z, colors='k',levels=levels)
plt.clabel(contour, fontsize=20, colors='k')
# 添加颜色条
plt.colorbar(cset)
mpl.rcParams["font.sans-serif"] = ["SimHei"]
mpl.rcParams["axes.unicode_minus"] = False
plt.title('title', fontsize=20)
plt.xlabel('x', fontsize=15)
plt.ylabel('y', fontsize=15)
plt.xticks(np.arange(start_x,end_x,step_x))
plt.yticks(np.arange(start_y, end_y, step_y))
plt.savefig(save_path, bbox_inches='tight')
plt.close()