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

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

文章目录

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

关于数据

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

绘图函数

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)

运行结果

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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解决idea各种奇葩报错(前提代码正确)

1.当idea中报错&#xff0c;把idea系统关掉 2.删除.idea中原有的配置 3.重新打开工程&#xff0c;基本上可以解决&#xff08;具体情况具体分析&#xff09;

DDT+yaml实现数据驱动接口自动化

前言 在之前的文章中我们知道了yaml文件可以进行接口自动化。除了yaml文件&#xff0c;Excel文档也可以用来编写自动化测试用例。 一定很想知道这两者有什么区别吧&#xff1f; 1、Excel使用简单&#xff0c;维护难&#xff0c;多种数据类型转换起来比较复杂 2、yaml学习稍…

解决QT cc1plus.exe: error: out of memory allocating

QT中增加资源文件过大时&#xff0c;会编译不过&#xff0c;报错&#xff1a; cc1plus.exe: out of memory allocating 1073745919 bytes 使用qrc资源文件&#xff0c;也就是在QT的工程中添加资源文件&#xff0c;就是添加的资源文件&#xff08;如qrc.cpp&#xff09;会直接被…

解决轻松解决谷歌浏览器火狐浏览器主页被360导航篡改问题浏览器启动页被篡改为360导航栏等

重置Chrome浏览器设置 尝试重置chrome浏览器全部设置。进入Chrome设置页&#xff0c;点击最下方的“高级设置”。 将鼠标滚到最底部&#xff0c;点击“重置设置” 然后关闭浏览器&#xff0c;重新打开即可。 包括ie几乎所有浏览器都可以重置... 重置火狐浏览器设置 设置——主…

WIN32部分知识介绍

&#x1f308;前言&#xff1a;此篇博客是为下一篇的《贪吃蛇》的做的前戏工作&#xff0c;这篇会讲到贪吃蛇所用到的一些工具以及函数。 首先在讲WIN32的内容时我们想了解一下他的基本概念&#xff1a; Windows 这个多作业系统除了协调应⽤程序的执⾏、分配内存、管理资源之外…

zookeeper Study

zk介绍&#xff1b;一种分布式协调服务。 分布式锁&#xff0c;集群选举&#xff0c;数据同步 。 zk都能进行操作&#xff0c;redis&#xff0c;kafka&#xff0c;rabbitmq&#xff0c;都能够用zk做协调管理服务。关键时zk简单操作。 应用说明&#xff1a; 简单介绍一下流程 &…

Vivado原语模板

1.原语的概念 原语是一种元件&#xff01; FPGA原语是芯片制造商已经定义好的基本电路元件&#xff0c;是一系列组成逻辑电路的基本单元&#xff0c;FPGA开发者编写逻辑代码时可以调用原语进行底层构建。 原语可分为预定义原语和用户自定义原语。预定义原语为如and/or等门级原语…

吴恩达机器学习-可选实验室:逻辑回归(Logistic Regression))

在这个不评分的实验中&#xff0c;你会探索sigmoid函数(也称为逻辑函数)探索逻辑回归;哪个用到了sigmoid函数 import numpy as np %matplotlib widget import matplotlib.pyplot as plt from plt_one_addpt_onclick import plt_one_addpt_onclick from lab_utils_common impor…

​SSD主控厂商SMI 4FQ23最新财报发布:业绩表现超预期

Silicon Motion Technology Corporation公布了截至2023年12月31日的第四季度财务报告。 2023年第四季度&#xff08;4FQ23&#xff09;销售收入相对于上一季度&#xff08;3FQ23&#xff09;增长了17%。同时&#xff0c;与去年同期&#xff08;4FQ22&#xff09;相比&#xff0…

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

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

Python实现ETS指标平滑模型(ETSModel算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 ETS模型&#xff08;Error-Trend-Seasonality Model&#xff09;&#xff0c;是一种广泛应用于时间序列…

基于Token的身份验证:安全与效率的结合

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

STM32中断和外部中断

NVIC&#xff1a;嵌套中断向量控制器&#xff1a;用于统一分配中断优先级和管理中断 响应式优先级&#xff1a;也可以称为插队式优先级哪个优先级高优先处理哪个 抢占式优先级&#xff1a;优先级高的可以优先被处理&#xff0c;相当于CPU可以暂时中断当前处理的程序&#xff0c…

EVE-NG桥接虚拟网卡实现与虚拟机通讯

一、知识补充 1、VMware网络连接 在VM中&#xff0c;给我们提供了以下几种连接网络的模式 桥接模式&#xff1a;直接联机物理网络NAT模式&#xff1a;用于共享主机的IP地址仅主机模式&#xff1a;与主机共享的专用网络自定义&#xff1a;特定虚拟网络LAN区段 特别注意的是&am…

一款Mac系统NTFS磁盘读写软件Tuxera NTFS 2023 for Mac

当您获得一台新 Mac 时&#xff0c;它只能读取 Windows NTFS 格式的 USB 驱动器。要将文件添加、保存或写入您的 Mac&#xff0c;您需要一个附加的 NTFS 驱动程序。Tuxera 的 Microsoft NTFS for Mac 2023是一款易于使用的软件&#xff0c;可以在 Mac 上打开、编辑、复制、移动…

如何查看centos7中启动了几个nginx

在 CentOS 7 中&#xff0c;最常用的几种方法如下&#xff1a; 1. 使用 ps 命令 ps 命令可以用来显示当前系统中正在运行的进程。要查看所有 Nginx 进程&#xff0c;可以使用以下命令&#xff1a; ps -ef | grep nginx这个命令会列出所有包含“nginx”字符串的进程。输出中会…

win11家庭版docker和milvus

docker 1、官网下载docker文件Get Started | Docker&#xff0c;选择download for windows下载。 2、双击打开下载好的文件Docker Desktop Installer.exe&#xff0c;add shortcut to desktop选择√代表同意添加快捷键到桌面&#xff0c;如果不勾选就说明不创建快捷键&#x…

关于安卓ZXing条码识别(二)适配竖屏

背景 不知道如何引入源码的&#xff0c;请看我第一篇文章&#xff0c;安卓源码引入 第一篇文章&#xff0c;粗略讲解了如何引入zxing到安卓的源码中&#xff0c;但是默认是横屏识别。 本文内容&#xff0c;就是如何进行竖屏识别。 环境 win10 as4 jdk8 感谢 博客 实现 …

ptmalloc、tcmalloc与jemalloc对比分析

文章目录 一、内存管理二、ptmalloc系统角度看ptmalloc内存管理用户角度看ptmalloc内存管理线程中内存管理从工作原理来看从作用来看Chunk说明问题 三、tcmalloc系统角度看tcmalloc内存管理用户角度看tcmalloc内存管理tcmalloc的优势 四、jemalloc系统角度看jemalloc内存管理用…

上门按摩服务随心约·专业技师待命中·小程序轻松享健康,博纳软云预约服务小程序定制开发

在现代社会&#xff0c;随着生活节奏的加快&#xff0c;人们对健康与放松的需求也日益增长。传统的按摩服务虽然能够带来身心的舒缓&#xff0c;但往往受限于时间和地点&#xff0c;使得许多人难以享受到这一服务。然而&#xff0c;随着科技的进步&#xff0c;上门按摩服务小程…