常用的指标可视化方法

作者: 小墨 分类: 数据预处理方法 发布时间: 2021-09-11 10:30 访问量:13,572
FavoriteLoading收藏

下面小墨给大家分享数据分析时常用的指标可视化方法。

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() 

示例效果如下图所示:

img

本篇文章就到这里了,感谢您的支持。

     

如果觉得小墨的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论