关系(二)利用python绘制热图

关系(二)利用python绘制热图

热图 (Heatmap)简介

热图适用于显示多个变量之间的差异,通过颜色判断彼此之间是否存在相关性。

快速绘制

  1. 基于seaborn

    python 复制代码
    import seaborn as sns
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib as mpl
    
    # 自定义数据
    df = pd.DataFrame(np.random.random((5,5)), columns=["a","b","c","d","e"])
    
    # 利用seaborn的heatmap函数创建
    sns.heatmap(df)
    
    plt.show()

定制多样化的热图

自定义热图一般是结合使用场景对相关参数进行修改,并辅以其他的绘图知识。参数信息可以通过官网进行查看,其他的绘图知识则更多来源于实战经验,大家不妨将接下来的绘图作为一种学习经验,以便于日后总结。

seaborn主要利用heatmap绘制热图,可以通过seaborn.heatmap了解更多用法

  1. 不同输入格式的热图

    python 复制代码
    import matplotlib.pyplot as plt
    import numpy as np
    import seaborn as sns
    import pandas as pd
    np.random.seed(0)
    
    sns.set(font='SimHei', font_scale=0.8, style="white") # 解决Seaborn中文显示问题
    
    # 初始化
    fig = plt.figure(figsize=(12,8))
    
    # 宽型:是一个矩阵,其中每一行都是一个个体,每一列都是一个观察值。即热图的每个方块代表一个单元格
    df = pd.DataFrame(np.random.random((6,5)), columns=["a","b","c","d","e"])
    
    ax = plt.subplot2grid((2, 2), (0, 0), colspan=1)
    sns.heatmap(df)
    ax.set_title('宽型')
    
    # 方型:相关矩阵热图
    df = pd.DataFrame(np.random.random((100,5)), columns=["a","b","c","d","e"]) 
    corr_matrix=df.corr() # 计算相关矩阵
    
    ax = plt.subplot2grid((2, 2), (0, 1), colspan=1)
    sns.heatmap(corr_matrix)
    ax.set_title('方型')
    
    # 方型:对角矩阵
    df = pd.DataFrame(np.random.random((100,5)), columns=["a","b","c","d","e"]) 
    corr_matrix=df.corr() # 计算相关矩阵
    mask = np.zeros_like(corr_matrix)
    mask[np.triu_indices_from(mask)] = True # 生成上三角蒙版
    
    ax = plt.subplot2grid((2, 2), (1, 0), colspan=1)
    sns.heatmap(corr_matrix, mask=mask, square=True)
    ax.set_title('方型-对角矩阵')
    
    # 长型:每一行代表一个观测结果,输入三个变量(x,y,z)
    people = np.repeat(("A","B","C","D","E"),5)
    feature = list(range(1,6))*5
    value = np.random.random(25)
    df = pd.DataFrame({'feature': feature, 'people': people, 'value': value })
    # 数据透视
    df_wide = df.pivot_table( index='people', columns='feature', values='value') 
    
    ax = plt.subplot2grid((2, 2), (1, 1), colspan=1)
    sns.heatmap(df_wide)
    ax.set_title('长型')
    
    fig.tight_layout() # 自动调整间距
    plt.show()
  2. 自定热图

    python 复制代码
    import matplotlib.pyplot as plt
    import numpy as np
    import seaborn as sns
    import pandas as pd
    np.random.seed(0)
    
    sns.set(font='SimHei', font_scale=0.8, style="white") # 解决Seaborn中文显示问题
    
    # 自定义数据
    df = pd.DataFrame(np.random.random((10,10)), columns=["a","b","c","d","e","f","g","h","i","j"])
    
    # 初始化
    fig = plt.figure(figsize=(9,8))
    
    # 显示值标签
    ax = plt.subplot2grid((3, 2), (0, 0), colspan=1)
    sns.heatmap(df, annot=True, annot_kws={"size": 7})
    ax.set_title('显示值标签')
    
    # 自定义网格线
    ax = plt.subplot2grid((3, 2), (0, 1), colspan=1)
    sns.heatmap(df, linewidths=2, linecolor='yellow')
    ax.set_title('自定义网格线')
    
    # 移除x、y或者颜色bar
    ax = plt.subplot2grid((3, 2), (1, 0), colspan=1)
    sns.heatmap(df, yticklabels=False, cbar=False)
    ax.set_title('移除部分轴元素')
    
    # 减少标签数量
    ax = plt.subplot2grid((3, 2), (1, 1), colspan=1)
    sns.heatmap(df, xticklabels=4)
    ax.set_title('减少标签数量')
    
    # 指定中心值
    ax = plt.subplot2grid((3, 2), (2, 0), colspan=1)
    sns.heatmap(df, center=1)
    ax.set_title('指定中心值')
    
    # 指定颜色
    ax = plt.subplot2grid((3, 2), (2, 1), colspan=1)
    sns.heatmap(df, cmap="YlGnBu")
    ax.set_title('指定颜色')
    
    
    fig.tight_layout() # 自动调整间距
    plt.show()
  3. 数据标准化

    python 复制代码
    import matplotlib.pyplot as plt
    import numpy as np
    import seaborn as sns
    import pandas as pd
    np.random.seed(0)
    
    sns.set(font='SimHei', font_scale=0.8, style="white") # 解决Seaborn中文显示问题
    
    # 自定义数据
    df = pd.DataFrame(np.random.randn(10,10) * 4 + 3)
    # 列含异常值与标准化
    df_col = df.copy()
    df_col[1]=df_col[1]+40 # 构造异常数据点
    df_norm_col=(df_col-df_col.mean())/df_col.std() # 按列标准化
    # 行含异常值与标准化
    df_row = df.copy()
    df_row.iloc[2]=df_row.iloc[2]+40 # 构造异常数据点
    df_norm_row = df_row.apply(lambda x: (x-x.mean())/x.std(), axis = 1) # 按行标准化
    
    
    # 初始化
    fig = plt.figure(figsize=(12,8))
    
    # 列含异常数据
    ax = plt.subplot2grid((2, 2), (0, 0), colspan=1)
    sns.heatmap(df_col, cmap='viridis')
    ax.set_title('列含异常数据')
    
    # 按列标准化
    ax = plt.subplot2grid((2, 2), (0, 1), colspan=1)
    sns.heatmap(df_norm_col, cmap='viridis')
    ax.set_title('按列标准化')
    
    # 行含异常数据
    ax = plt.subplot2grid((2, 2), (1, 0), colspan=1)
    sns.heatmap(df_row, cmap='viridis')
    ax.set_title('行含异常数据')
    
    # 按行标准化
    ax = plt.subplot2grid((2, 2), (1, 1), colspan=1)
    sns.heatmap(df_norm_col, cmap='viridis')
    ax.set_title('按行标准化')
    
    
    fig.tight_layout() # 自动调整间距
    plt.show()
  4. 引申-聚类热图

    可以通过seaborn.clustermap了解更多用法

    python 复制代码
    import matplotlib.pyplot as plt
    import numpy as np
    import seaborn as sns
    import pandas as pd
    
    # 导入数据
    df = pd.read_csv('https://raw.githubusercontent.com/holtzy/The-Python-Graph-Gallery/master/static/data/mtcars.csv')
    df = df.set_index('model')
    
    # 基本聚类热图
    g = sns.clustermap(df, standard_scale=1) # 标准化处理
    
    plt.show()

总结

以上通过seaborn的heatmap快速绘制热图,并通过修改参数或者辅以其他绘图知识自定义各种各样的热图来适应相关使用场景。

共勉~

相关推荐
曲幽10 分钟前
FastAPI压力测试实战:Locust模拟真实用户并发及优化建议
python·fastapi·web·locust·asyncio·test·uvicorn·workers
敏编程5 小时前
一天一个Python库:jsonschema - JSON 数据验证利器
python
前端付豪5 小时前
LangChain记忆:通过Memory记住上次的对话细节
人工智能·python·langchain
databook5 小时前
ManimCE v0.20.1 发布:LaTeX 渲染修复与动画稳定性提升
python·动效
花酒锄作田18 小时前
使用 pkgutil 实现动态插件系统
python
前端付豪1 天前
LangChain链 写一篇完美推文?用SequencialChain链接不同的组件
人工智能·python·langchain
曲幽1 天前
FastAPI实战:打造本地文生图接口,ollama+diffusers让AI绘画更听话
python·fastapi·web·cors·diffusers·lcm·ollama·dreamshaper8·txt2img
老赵全栈实战1 天前
Pydantic配置管理最佳实践(一)
python
阿尔的代码屋1 天前
[大模型实战 07] 基于 LlamaIndex ReAct 框架手搓全自动博客监控 Agent
人工智能·python
AI探索者2 天前
LangGraph StateGraph 实战:状态机聊天机器人构建指南
python