【数据可视化】动手用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之间,用于colormapdef 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 osimport matplotlib
import numpy as np
import pandas as pd
from matplotlib import pyplot as pltplt.rcParams['font.sans-serif'] = ['Simhei']  # 显示中文标签
plt.rcParams['axes.unicode_minus'] = Falsedef 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之间,用于colormapdef 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.rhkb.cn/news/274906.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

零、自然语言处理开篇

目录 0、NLP任务的基础——符号向量化 0.0 词袋模型 0.1 查表/One-hot编码 0.2 词嵌入模型/预训练模型 0.2.0 Word2Vec &#xff08;0&#xff09;CBOW &#xff08;1&#xff09;Skip-gram 0.2.1 GloVe 0.2.2 WordPiece 0.2.3 BERT 0.2.4 ERNIE NLP学习笔记系列&am…

OKHttpRetrofit

完成一个get请求 1.导入依赖 implementation("com.squareup.okhttp3:okhttp:3.14.")2.开启viewBinding android.buildFeatures.viewBinding true 3.加网络权限 和 http明文请求允许配置文件 <?xml version"1.0" encoding"utf-8"?> &l…

利用国产库libhv动手写一个web_server界面(一)

目录 一.实现要求 流程图 测试libhv中的http服务 1.启动http服务端 2.启动http客户端 3.网址访问 4.状态图 5.时序图 结果展示 1.基本的登录界面 2.简易的配置ip及其端口的界面 3.设置成功后返回 这是一个关于webserver HTTP SERVER http server 模块的制作 一.实…

力扣串题:验证回文串2

整体思路&#xff1a;先找到可能存在问题的点&#xff0c;然后判断&#xff0c;如果一切正常则左指针会来到字符串中部 bool isValidPalindrome(char *s, int i, int j) {while (i < j) {if (s[i] ! s[j]) {return false;}i;j--;}return true; }bool validPalindrome(char …

11.Java---语法总结之一个小项目

图书管理系统 Java学习了很久了,今天将运用之前学习的所有东西整理做个小小的小项目. 1.首先是各种包和操作方法建好 2.然后是项目的大框架搭好 3.然后就开始实现各个部分了 看看最后的运行结果吧! 管理员测试 1.登录&显示图书的运行结果 2.查找&新增图书的运行结…

2024年视频号带货蓝海项目真的可做吗?

在数字经济的浪潮下&#xff0c;视频号带货作为一种新兴的电商模式&#xff0c;近年来备受瞩目。随着5G技术的普及和移动设备的更新换代&#xff0c;视频平台用户规模持续增长&#xff0c;为视频号带货提供了广阔的舞台。然而&#xff0c;面对2024年这个未来节点&#xff0c;我…

9个免费游戏后端平台

在这篇文章中&#xff0c;您将看到 九个免费的游戏服务平台提供商&#xff0c;这可以帮助您开始在线多人游戏&#xff0c;而无需预先投入大量资金。 每个提供商都有非常独特的功能&#xff0c;因此成本应该只是决定时要考虑的方面之一。 我还从低预算项目的角度对免费提供商进…

《JAVA与模式》之原型模式

系列文章目录 文章目录 系列文章目录前言一、原型模式的结构二、简单形式的原型模式三、登记形式的原型模式四、克隆满足的条件五、浅克隆和深克隆前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用…

初识kubernetes

Kubernetes核心概念 Master Master节点主要负责资源调度(Scheduler)&#xff0c;控制副本(Replication Controller)&#xff0c;和提供统一访问集群的入口(API Server)。---核心节点也是管理节点 Node Node是Kubernetes集群架构中运行Pod的服务节点&#xff08;亦叫agent或min…

北京碳中和经营许可证办理条件及流程与我们的专业服务

各位老板好&#xff0c;随着全球气候变化问题的日益严重&#xff0c;碳中和成为了企业社会责任和可持续发展的关键一环。在北京&#xff0c;越来越多的企业开始关注并投入到碳中和的行列中。为了规范市场秩序&#xff0c;确保碳中和活动的合法性和有效性&#xff0c;北京地区实…

Splitpanes拆分窗格插件使用

目录 基本用法 纵向排列 遍历渲染 动态拆分宽度 项目开发中用到了拆分窗格(就是下面的效果&#xff0c;可以拆分网页&#xff0c;我们项目通常都是用左右两块拆分&#xff0c;可以通过拖动图标进行左右拖动)&#xff0c;于是就发现了一个很好用的插件&#xff1a;Splitpane…

Day37:安全开发-JavaEE应用JNDI注入RMI服务LDAP服务JDK绕过调用链类

目录 JNDI注入-RMI&LDAP服务 JNDI远程调用-JNDI-Injection JNDI远程调用-marshalsec JNDI-Injection & marshalsec 实现原理 JNDI注入-FastJson漏洞结合 JNDI注入-JDK高版本注入绕过 思维导图 Java知识点&#xff1a; 功能&#xff1a;数据库操作&#xff0c;文…

一款好用的AI工具——边界AICHAT(三)

目录 3.23、文档生成PPT演示3.24、AI文档翻译3.25、AI翻译3.26、论文模式3.27、文章批改3.28、文章纠正3.29、写作助手3.30、文言文翻译3.31、日报周报月报生成器3.32、OCR-DOC办公文档识别3.33、AI真人语音合成3.34、录音音频总结3.35、域方模型市场3.36、模型创建3.37、社区交…

每日汇评:如果支撑位守住2145美元,黄金可能反弹至纪录高位

金价在周二因美国CPI数据火爆而暴跌后保持稳定&#xff1b; 美元和美债收益率在美元/日元下跌中暂停反弹&#xff1b; 随着美国CPI的出炉&#xff0c;市场焦点转向周四的零售销售和PPI数据&#xff1b; 金价在2160美元附近盘整&#xff0c;周二从2195美元的纪录高位回调约1%。由…

白嫖AWS云服务器,验证、注册指南

背景 不知道你想不想拥有一台属于自己的云服务器呢&#xff0c;拥有一台自己的云服务器可以建站&#xff0c;可以在上面搭建个人博客&#xff0c;今天我就来教大家如何申请亚马逊 AWS 免费云服务器&#xff0c;这个云服务器可以长达12个月的免费。而且到期后可以继续换个账号继…

【阿里云系列】-基于云效构建部署NodeJS项目到ACK

准备工作 01、编写Dockerfile文件可以根据不同的环境&#xff0c;新建不同的Dockerfile文件&#xff0c;比如Dockerfile-PROD # Deliver the dist folder with NginxFROM nginx:stable-alpine ENV LANGC.UTF-8 ENV TZAsia/ShanghaiCOPY dist/ /usr/share/nginx/html COPY ngi…

react的diff源码

react 的 render 阶段&#xff0c;其中 begin 时会调用 reconcileChildren 函数&#xff0c; reconcileChildren 中做的事情就是 react 知名的 diff 过程 diff 算法介绍 react 的每次更新&#xff0c;都会将新的 ReactElement 内容与旧的 fiber 树作对比&#xff0c;比较出它们…

【算法积累】辗转相除法

【算法积累】辗转相除法&#xff0c;python实现两种 辗转相除法&#xff08;又称欧几里得算法&#xff09;减法&#xff08;不常用&#xff09;代码实现执行结果 辗转相除法代码实现执行结果 辗转相除法&#xff08;又称欧几里得算法&#xff09; 又称欧几里得算法&#xff0c…

【洛谷 P8781】[蓝桥杯 2022 省 B] 修剪灌木 题解(数学)

[蓝桥杯 2022 省 B] 修剪灌木 题目描述 爱丽丝要完成一项修剪灌木的工作。 有 N N N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晩会修剪一棵灌木&#xff0c;让灌木的高度变为 0 0 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始&#xff0c;每天向右修剪一棵灌木…

镭速教你如何解决大数据量串行处理的问题

大数据的高效处理成为企业发展的关键。然而&#xff0c;大数据量串行处理的问题常常困扰着许多企业&#xff0c;尤其是在数据传输方面。本文将探讨大数据量串行处理的常见问题&#xff0c;并介绍企业常用的处理方式&#xff0c;最后重点阐述镭速如何提供创新解决方案&#xff0…