【数据可视化】动手用matplotlib绘制关联规则网络图

news2025/2/26 1:56:40

下载文中数据、代码、绘图结果

文章目录

    • 关于数据
    • 绘图函数
    • 完整可运行的代码
    • 运行结果

关于数据

如果想知道本文的关联规则数据是怎么来的,请阅读这篇文章

绘图函数

Python中似乎没有很方便的绘制网络图的函数。

下面是本人自行实现的绘图函数,如果想要运行,请点击上文的链接,下载数据和代码。

传入一个关联规则数据的DataFrame,这个DataFrame应该包含三列数据:antecedentsconsequentsconfidence,分别代表前件,后件,置信度。

def plot_rules_net(rules: pd.DataFrame):
    import matplotlib.patches as patches

    # 假设你有一个包含所有药材的列表
    items = list(
        set([item for sublist in rules['antecedents'].tolist() + rules['consequents'].tolist() for item in sublist]))

    # 计算药材数量,确定顶点数
    n_items = len(items)

    # 创建一个正n_items边形的顶点坐标
    radius = 5  # 可以调整半径
    angle = np.linspace(0, 2 * np.pi, n_items, endpoint=False)
    x = radius * np.cos(angle)
    y = radius * np.sin(angle)

    # 绘制正多边形和顶点
    fig, ax = plt.subplots(figsize=(10, 10))

    polygon = patches.RegularPolygon((0, 0), n_items, radius=radius, fill=False, edgecolor='k')
    ax.add_patch(polygon)

    def get_label_position(angle):
        label_offset_value = 0.2  # 定义一个变量来存储偏移量

        # 根据角度确定文本标签的对齐方式和位置
        if angle < np.pi / 2:
            ha, va = "center", "bottom"
            offset = np.array([label_offset_value, label_offset_value])
        elif angle < np.pi:
            ha, va = "center", "bottom"
            offset = np.array([-label_offset_value, label_offset_value])
        elif angle < 3 * np.pi / 2:
            ha, va = "center", "top"
            offset = np.array([-label_offset_value, -label_offset_value])
        else:
            ha, va = "center", "top"
            offset = np.array([label_offset_value, -label_offset_value])
        return ha, va, offset

    # 在绘制顶点的循环中调整文本位置
    for (i, j), label, angle in zip(zip(x, y), items, angle):
        ha, va, offset = get_label_position(angle)
        ax.plot(i, j, 'o', markersize=10)
        ax.text(i + offset[0], j + offset[1], label, fontsize=12, ha=ha, va=va)

    # 获取confidence的最小值和最大值
    min_confidence = rules['confidence'].min()
    max_confidence = rules['confidence'].max()
    # 使用colormap - 可以根据需要选择合适的colormap
    # 这里我们使用'Greens',因为你想要的是颜色越深表示权重越大
    cmap = plt.get_cmap('Greens')

    # 线性映射函数,将confidence值映射到0-1之间,用于colormap
    def get_color(confidence):
        return cmap((confidence - min_confidence) / (max_confidence - min_confidence))

    # 绘制边
    for _, row in rules.iterrows():
        antecedents = row['antecedents']
        consequents = row['consequents']
        confidence = row['confidence']

        for antecedent in antecedents:
            for consequent in consequents:
                start_idx = items.index(antecedent)
                end_idx = items.index(consequent)

                start_point = (x[start_idx], y[start_idx])
                end_point = (x[end_idx], y[end_idx])

                color = get_color(confidence)

                # 修改箭头的绘制方式,使其从节点边缘出发
                ax.annotate("",
                            xy=end_point, xytext=start_point,
                            arrowprops=dict(arrowstyle="->", color=color,
                                            shrinkA=5, shrinkB=5,  # shrinkA和shrinkB应该是半径的大小,不是索引
                                            connectionstyle="arc3"),
                            )

    ax.set_xlim([-radius * 1.1, radius * 1.1])
    ax.set_ylim([-radius * 1.1, radius * 1.1])
    ax.axis('off')  # 隐藏坐标轴

    plt.suptitle('前24个最高频次药物的关联规则图', fontsize=20)  # 主标题
    plt.xlabel('颜色深代表置信度高', fontsize=14)  # X轴标签

    save_path = os.path.join('.', '关联规则网络图.jpg')

    plt.savefig(save_path)
    plt.show()


完整可运行的代码

下方就是完整可运行的代码,在本文的下载链接中也一并包含,如有需要请复制并运行。

import os

import matplotlib
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt

plt.rcParams['font.sans-serif'] = ['Simhei']  # 显示中文标签
plt.rcParams['axes.unicode_minus'] = False

def plot_rules_net(rules: pd.DataFrame):
    import matplotlib.patches as patches

    # 假设你有一个包含所有药材的列表
    items = list(
        set([item for sublist in rules['antecedents'].tolist() + rules['consequents'].tolist() for item in sublist]))

    # 计算药材数量,确定顶点数
    n_items = len(items)

    # 创建一个正n_items边形的顶点坐标
    radius = 5  # 可以调整半径
    angle = np.linspace(0, 2 * np.pi, n_items, endpoint=False)
    x = radius * np.cos(angle)
    y = radius * np.sin(angle)

    # 绘制正多边形和顶点
    fig, ax = plt.subplots(figsize=(10, 10))

    polygon = patches.RegularPolygon((0, 0), n_items, radius=radius, fill=False, edgecolor='k')
    ax.add_patch(polygon)

    def get_label_position(angle):
        label_offset_value = 0.2  # 定义一个变量来存储偏移量

        # 根据角度确定文本标签的对齐方式和位置
        if angle < np.pi / 2:
            ha, va = "center", "bottom"
            offset = np.array([label_offset_value, label_offset_value])
        elif angle < np.pi:
            ha, va = "center", "bottom"
            offset = np.array([-label_offset_value, label_offset_value])
        elif angle < 3 * np.pi / 2:
            ha, va = "center", "top"
            offset = np.array([-label_offset_value, -label_offset_value])
        else:
            ha, va = "center", "top"
            offset = np.array([label_offset_value, -label_offset_value])
        return ha, va, offset

    # 在绘制顶点的循环中调整文本位置
    for (i, j), label, angle in zip(zip(x, y), items, angle):
        ha, va, offset = get_label_position(angle)
        ax.plot(i, j, 'o', markersize=10)
        ax.text(i + offset[0], j + offset[1], label, fontsize=12, ha=ha, va=va)

    # 获取confidence的最小值和最大值
    min_confidence = rules['confidence'].min()
    max_confidence = rules['confidence'].max()
    # 使用colormap - 可以根据需要选择合适的colormap
    # 这里我们使用'Greens',因为你想要的是颜色越深表示权重越大
    cmap = plt.get_cmap('Greens')

    # 线性映射函数,将confidence值映射到0-1之间,用于colormap
    def get_color(confidence):
        return cmap((confidence - min_confidence) / (max_confidence - min_confidence))

    # 绘制边
    for _, row in rules.iterrows():
        antecedents = row['antecedents']
        consequents = row['consequents']
        confidence = row['confidence']

        for antecedent in antecedents:
            for consequent in consequents:
                start_idx = items.index(antecedent)
                end_idx = items.index(consequent)

                start_point = (x[start_idx], y[start_idx])
                end_point = (x[end_idx], y[end_idx])

                color = get_color(confidence)

                # 修改箭头的绘制方式,使其从节点边缘出发
                ax.annotate("",
                            xy=end_point, xytext=start_point,
                            arrowprops=dict(arrowstyle="->", color=color,
                                            shrinkA=5, shrinkB=5,  # shrinkA和shrinkB应该是半径的大小,不是索引
                                            connectionstyle="arc3"),
                            )

    ax.set_xlim([-radius * 1.1, radius * 1.1])
    ax.set_ylim([-radius * 1.1, radius * 1.1])
    ax.axis('off')  # 隐藏坐标轴

    plt.suptitle('前24个最高频次药物的关联规则图', fontsize=20)  # 主标题
    plt.xlabel('颜色深代表置信度高', fontsize=14)  # X轴标签

    save_path = os.path.join('.', '关联规则网络图.jpg')

    plt.savefig(save_path)
    plt.show()



freq = pd.read_excel(r'万条处方的药物出现频次.xlsx')

fd = {k : v for _, (k, v) in freq.iterrows()}

# 指定保留前24最高频次的中药材
most_freq_num = 24
top_24_herbs = sorted(fd, key=lambda x: fd.get(x), reverse=True)[:most_freq_num]

# 读取关联规则分析的结果
rules = pd.read_excel('关联规则分析结果.xlsx')
rules['antecedents'] = rules['antecedents'].apply(lambda x: x.split(', '))
rules['consequents'] = rules['consequents'].apply(lambda x: x.split(', '))

# 过滤关联规则,仅保留包含这24种药物的规则
filtered_rules = rules[rules['antecedents'].apply(lambda x: any(item in x for item in top_24_herbs)) &
                       rules['consequents'].apply(lambda x: any(item in x for item in top_24_herbs))]

plot_rules_net(filtered_rules)

运行结果

颜色越粗,置信度越高。
我们可以看到砂仁白芍,还有荷叶连翘等等,有着很高的置信度。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1504904.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深度学习笔记】6_9 深度循环神经网络deep-rnn

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 6.9 深度循环神经网络 本章到目前为止介绍的循环神经网络只有一个单向的隐藏层&#xff0c;在深度学习应用里&#xff0c;我们通常会用…

three.js如何实现简易3D机房?(四)点击事件+呼吸灯效果

接上一篇&#xff1a; three.js如何实现简易3D机房&#xff1f;&#xff08;三&#xff09;显示信息弹框/标签&#xff1a;http://t.csdnimg.cn/5W2wA 目录 八、点击事件 1.实现效果 2.获取相交点 3.呼吸灯效果 4.添加点击事件 5.问题解决 八、点击事件 1.实现效果 2.…

ChatGPT发不出消息?GPT发不出消息怎么办?

前言 今天发现&#xff0c;很多人的ChatGPT无法发送信息&#xff0c;我就登陆看一下自己的GPT的情况&#xff0c;结果还真的无法发送消息&#xff0c;ChatGPT 无法发送消息&#xff0c;但是能查看历史的对话&#xff0c;不过通过下面的方法解决了。 第一时间先打开官方的网站&a…

Mint_21.3 drawing-area和goocanvas的FB笔记(七)

FreeBASIC gfx 基本 graphics 绘图 8、ScreenControl与屏幕窗口位置设置 FreeBASIC通过自建屏幕窗口摆脱了原来的屏幕模式限制&#xff0c;既然是窗口&#xff0c;在屏幕坐标中就有它的位置。ScreenControl GET_WINDOW_POS x, y 获取窗口左上角的x, y位置&#xff1b;ScreenC…

【REST2SQL】11 基于jwt-go生成token与验证

【REST2SQL】01RDB关系型数据库REST初设计 【REST2SQL】02 GO连接Oracle数据库 【REST2SQL】03 GO读取JSON文件 【REST2SQL】04 REST2SQL第一版Oracle版实现 【REST2SQL】05 GO 操作 达梦 数据库 【REST2SQL】06 GO 跨包接口重构代码 【REST2SQL】07 GO 操作 Mysql 数据库 【RE…

设计模式学习系列 -- 随记

文章目录 前言 一、设计模式是什么&#xff1f; 二、设计模式的历史 三、为什么以及如何学习设计模式&#xff1f; 四、关于模式的争议 一种针对不完善编程语言的蹩脚解决方案 低效的解决方案 不当使用 五、设计模式分类 总结 前言 最近可能工作生活上的稳定慢慢感觉自己丢失…

掌握 Vue3、Vite 和 SCSS 实现一键换肤的魔法步骤

前言 一个网站的换肤效果算是一个比较常见的功能&#xff0c;尤其是在后台管理系统中&#xff0c;我们几乎都能看到他的身影&#xff0c;这里给大家提供一个实现思路。 搭建项目 vitevue3搭建项目这里就不演示了&#xff0c;vite官网里面讲得很清楚。 注&#xff1a;这里使…

浅析开源内存数据库Fastdb

介绍&#xff1a; Fastdb是免费开源内存数据库&#xff0c;其优秀的性能&#xff0c;和简洁的C代码&#xff0c;让我学习使用过程中收益颇多&#xff0c;但是国内中文相关研究的文章相当稀少&#xff0c;外文我查询相当不便。有兴趣的朋友可以通过以下网站访问&#xff1a;Mai…

java-ssm-jsp基于ssm的冰淇淋在线购买网站

java-ssm-jsp基于ssm的冰淇淋在线购买网站 获取源码——》公主号&#xff1a;计算机专业毕设大全

【STM32】HAL库 CubeMX 教程 --- 通用定时器 TIM2 定时

实验目标&#xff1a; 通过CUbeMXHAL&#xff0c;配置TIM2&#xff0c;1s中断一次&#xff0c;闪烁LED。 一、常用型号的TIM时钟频率 1. STM32F103系列&#xff1a; 所有 TIM 的时钟频率都是72MHz&#xff1b;F103C8不带基本定时器&#xff0c;F103RC及以上才带基本定时器。…

react实战——react旅游网

慕课网react实战 搭建项目问题1.按照官网在index.tsx中引入antd出错&#xff1f;2.typescript中如何使用react-router3.react-router3.1 V63.2 V53.3V6实现私有路由 4.函数式组件接收props参数时定义数据接口&#xff1f;5.使用TypeScript开发react项目&#xff1a;6.要使一个组…

探索stable diffusion的奇妙世界--01

目录 1. 理解prompt提示词&#xff1a; 2. Prompt中的技术参数&#xff1a; 3. Prompt中的Negative提示词&#xff1a; 4. Prompt中的特殊元素&#xff1a; 5. Prompt在stable diffusion中的应用&#xff1a; 6. 作品展示&#xff1a; 在AI艺术领域&#xff0c;stable di…

数据结构——线性表顺序表示详解

目录 1.线性表的类型定义 2.基本操作 3.线性表的存储结构 4.补充 1.元素类型说明 2.数组定义​编辑 3.c语言的内存动态分配 4.c的动态存储分配 5.c中的参数传递 引用类型作参数 6.顺序表基本操作的实现 1.线性表的初始化 代码示例&#xff1a; 2.销毁线性表&…

远程连接Linux系统

图形化、命令行 对于操作系统的使用&#xff0c;有2种使用形式&#xff1a; 图形化页面使用操作系统 图形化&#xff1a;使用操作系统提供的图形化页面&#xff0c;以获得图形化反馈的形式去使用操作系统。 以命令的形式使用操作系统 命令行&#xff1a;使用操作系统提供的各…

腾讯云轻量服务器Windows系统使用IIS实现公网直链访问文件

windows方便所以服务器装的windows系统&#xff0c;windows默认不能分享文件直链&#xff0c;只要用IIS建个站点就行了 先弄一台有公网ip的windows系统服务器打开服务器管理器&#xff0c;添加这个 打开IIS右键添加网站 程序池默认&#xff0c;路径选个文件夹作为网站根目录 …

tomcat通过service.bat install方式安装,内存不够了怎么办?

1.通过service.bat安装 安装命令再tomcat的bin目录下&#xff0c;执行命令 .\service.bat install Apache Tomcat 8.5 Tomcat8之后就会在服务里面有个tomcat服务 2. 如何增加tomcat内存呢&#xff1f; 通过service.bat安装肯定再service.bat中配置啊。 再service.bat文件中…

RHCE——一、OpenEuler22.03安装部署及例行性任务

RHCE 一、OpenEuler22.03安装部署及例行性任务 一、网络服务1.准备工作2、RHEL9操作系统的安装部署3、配置并优化OpenEuler22.034、网络配置实验&#xff1a;修改网络配置 二、例行性工作1、 单一执行的例行性任务&#xff1a;at&#xff08;一次性&#xff09;at命令详解 2、循…

MQTT连接阿里云物联网上报物模型数据

目录 1. 创建产品&#xff08;物联网平台 -> 产品 -> 创建产品&#xff09; 2. 为产品添加设备 3. 添加物模型 4. mqtt.fx连接测试 5. 调试物模型 6. 使用mqtt.fx上报温度数据 1. 创建产品&#xff08;物联网平台 -> 产品 -> 创建产品&#xff09; 我这里再新…

企业内部培训考试系统首页自定义版块说明

企业内部培训考试系统首页自定义版块说明&#xff0c;企业内部培训考试系统手机端首页设计太灵活。 1、整站主题色自定义&#xff0c;更换主题色后&#xff0c;重要的文字和按钮颜色都自动使用主题色渲染&#xff0c;相当于一键换皮肤。 2、首页背景图自定义&#xff0c;想换…

【蓝牙协议栈】【经典蓝牙】【BLE蓝牙】蓝牙技术特点

目录 1. 蓝牙技术特点 2. 经典蓝牙与BLE蓝牙对比 2.1 BT/BLE技术区分 2.2 支持的profile不同 2.3 核心架构&#xff0c;不同的controler 3. Bluetooth的系统构成 4. 蓝牙协议规范 4.1 传输协议 4.2 中介协议 4.3 应用协议 5. 蓝牙硬件接口 1. 蓝牙技术特点 简单地说…