常用的指标可视化方法


1、皮尔逊相关系数热力矩阵图
import matplotlib.pyplot as plt
import seaborn as sns
#皮尔逊相关系数
def relation_coefficient(data,labels):
# 求解相关系数
correction = data.corr()
# correction=abs(correlations)# 取绝对值,只看相关程度 ,不关心正相关还是负相关
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
fig = plt.figure(figsize=(10,8))
ax = sns.heatmap(correction, linewidths=0.05, vmax=1, vmin=0, annot=True,cbar=False,
annot_kws={'size': 18, 'weight': 'bold'})
cb = ax.figure.colorbar(ax.collections[0]) # 显示colorbar
cb.ax.tick_params(labelsize=18) # 设置colorbar刻度字体大小。
# 热力图参数设置(相关系数矩阵,颜色,每个值间隔等)
plt.xticks(np.arange(len(labels)) + 0.5, labels, rotation=0) # 横坐标标注点
plt.yticks(np.arange(len(labels)) + 0.5, labels, rotation=0) # 纵坐标标注点
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.show()
注意:data的数据类型位DataFrame。也可以传入numpy类型的数据,注释掉correction = data.corr()这一行即可。
2、最大信息系数热力图
皮尔逊只能说明线性相关性,而不能说明非线性相关性,而最大信息系数两者都能体现。
import matplotlib.pyplot as plt
import seaborn as sns
from minepy import MINE
#计算最大信息系数
def get_uliner_parma(data,label):
#data的类型位df
mic_list = []
for var1 in label:
mic=[]
x1=data[var1]
for var2 in label:
x2=data[var2]
mine = MINE()
mine.compute_score(x1, x2)
score=mine.mic()
mic.append(score)
mic_list.append(mic)
return np.array(mic_list)
#最大信息系数
def Nonlinearity_correct(data,labels):
correction=get_uliner_parma(data,labels)
#correction=abs(correlations)# 取绝对值,只看相关程度 ,不关心正相关还是负相关
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
fig = plt.figure(figsize=(10, 8))
ax = sns.heatmap(correction, linewidths=0.05, vmax=1, vmin=0, annot=True, cbar=False,
annot_kws={'size': 18, 'weight': 'bold'})
cb = ax.figure.colorbar(ax.collections[0]) # 显示colorbar
cb.ax.tick_params(labelsize=18) # 设置colorbar刻度字体大小。
# 热力图参数设置(相关系数矩阵,颜色,每个值间隔等)
plt.xticks(np.arange(len(labels)) + 0.5, labels, rotation=0) # 横坐标标注点
plt.yticks(np.arange(len(labels)) + 0.5, labels, rotation=0) # 纵坐标标注点
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.show()
3、局部放大图绘制
有的时候我们需要将图片中的某一部分放大,详细的观察局部的信息,那么该如何实现呢?
from mpl_toolkits.axes_grid1.inset_locator import inset_axes from matplotlib.patches import ConnectionPatch def expand_view(data,label): #data是二维的numpy数据 x_axis_data = [i for i in range(len(data))] fig, ax = plt.subplots(1, 1,figsize=(5,4)) ax.plot(x_axis_data, data[:,4],alpha=0.8, label=label[4]) #选择需要可视化的列以及相应的标签 ax.plot(x_axis_data, data[:,5],alpha=0.8, label=label[5]) ax.plot(x_axis_data, data[:,6],alpha=0.8, label=label[6]) axins = inset_axes(ax, width="50%", height="40%", loc=2, bbox_to_anchor=(0.1,0.007, 1, 1), bbox_transform=ax.transAxes) axins.plot(x_axis_data, data[:,4],alpha=0.8, label=label[4]) axins.plot(x_axis_data, data[:,5],alpha=0.8, label=label[5]) axins.plot(x_axis_data, data[:,6],alpha=0.8, label=label[6]) # 设置放大区间,即对那部分进行放大 zone_left = 100 zone_right = 300 # 坐标轴的扩展比例(根据实际数据调整) x_ratio = 0 # x轴显示范围的扩展比例 y_ratio = 0 # y轴显示范围的扩展比例 # X轴的显示范围 xlim0 = x_axis_data[zone_left]-(x_axis_data[zone_right]-x_axis_data[zone_left])*x_ratio xlim1 = x_axis_data[zone_right]+(x_axis_data[zone_right]-x_axis_data[zone_left])*x_ratio # Y轴的显示范围 y = np.hstack((data[:,4][zone_left:zone_right],data[:,5][zone_left:zone_right], data[:,6][zone_left:zone_right])) ylim0 = np.min(y)-(np.max(y)-np.min(y))*y_ratio ylim1 = np.max(y)+(np.max(y)-np.min(y))*y_ratio # 调整子坐标系的显示范围 axins.set_xlim(xlim0, xlim1) axins.set_ylim(ylim0, ylim1) # 原图中画方框 tx0 = xlim0 tx1 = xlim1 ty0 = ylim0 ty1 = ylim1 sx = [tx0,tx1,tx1,tx0,tx0] sy = [ty0,ty0,ty1,ty1,ty0] ax.plot(sx,sy,"red") # 画两条线 xy = (xlim0,ylim0) xy2 = (xlim0,ylim1) con = ConnectionPatch(xyA=xy2,xyB=xy,coordsA="data",coordsB="data", axesA=axins,axesB=ax) axins.add_artist(con) xy = (xlim1,ylim0) xy2 = (xlim1,ylim1) con = ConnectionPatch(xyA=xy2,xyB=xy,coordsA="data",coordsB="data", axesA=axins,axesB=ax) axins.add_artist(con) ax.legend(loc="lower left") #设置图例的位置 ax.set_xlabel('t/s') ax.set_ylabel('加速度/$gm/s^{2}$')
4、绘制双y轴图
def view_distribution(distribution_data,column_name): temp=distribution_data[column_name].values num_bins = 30 #分成的区间数 fig, ax1 = plt.subplots() bins=np.linspace(temp.min(),temp.max(),num_bins) color = 'red' ax1.set_ylabel('frequency', color=color) frequency, bin_list, patches=ax1.hist(temp,bins,facecolor='red',alpha=0.5) ax1.tick_params(axis='y', labelcolor=color) ax1.set_xlabel(column_name+" Value Bins") color = 'blue' ax2=ax1.twinx() ax2.set_ylabel('frequency function', color=color) sns.distplot(temp,hist=False,ax=ax2) ax2.tick_params(axis='y', labelcolor=color) plt.title("The distribution of "+column_name) fig.tight_layout() plt.show()
示例效果如下图所示: