【数据可视化】动手用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.mzph.cn/news/734300.shtml

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

相关文章

(每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)

项目建议与立项申请、初步可行性研究、详细可行性研究、评估与决策是项目投资前使其的四个阶段。在实际工作中&#xff0c;初步可行性研究和详细可行性研究可以依据项目的规模和繁简程度合二为一&#xff0c;但详细可行性研究是不可缺少的。升级改造项目制作初步和详细研究&…

windows11配置电脑IP

windows11配置电脑IP 选择"开始>设置>“网络&Internet >以太网”。在 "属性"下&#xff0c;编辑IP地址&#xff0c;子网掩码&#xff0c;网关以及DNS。

数据库系统原理实验报告1 | E-R图设计

整理自博主2021级专业课《数据库系统原理》自己完成的实验报告。 目录 一、实验目的 二、实验内容 1、某个学校有若干个系 2、某工厂生产若干产品 3、某学校的田径运动会中设置了各类比赛 4、自己调查一个需要提供开发数据库应用系统的单位 三、实验结果总结 四、实验结…

Java中常用的集合及方法(2)

在Java&#xff08;JDK8&#xff09;中&#xff0c;集合&#xff08;Collection&#xff09;是数据结构的实现&#xff0c;用于存储和操作对象集合。 集合&#xff08;Collection&#xff09;中包含的一般类或接口&#xff1a; 在这其中呢&#xff0c;我们经常使用的其实就是L…

API 设计的原则

我在 Thoughtworks 上曾经读到过一篇文章《API 设计的几条原则》我觉得写得非常不错&#xff0c;链接我放底下&#xff0c;推荐阅读。 在我多年的工作历程中&#xff0c;我深刻意识到 API 的设计至关重要&#xff0c;但是我发现&#xff0c;在一般的组织中&#xff0c;API 的设…

K8S - 在任意node里执行kubectl 命令

当我们初步安装玩k8s &#xff08;master 带 2 nodes&#xff09; 时 正常来讲kubectl 只能在master node 里运行 当我们尝试在某个 node 节点来执行时&#xff0c; 通常会遇到下面错误 看起来像是访问某个服务器的8080 端口失败了。 原因 原因很简单 , 因为k8s的各个组建&…

外包干了6天后悔了,技术明显进步。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入广州某软件公司&#xff0c;干了接近3年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

chrome高内存占用问题

chrome号称内存杀手不是盖的&#xff0c;不设设置的话&#xff0c;经常被它内存耗尽死机是常事。以下自用方法 1 自带的memory saver chrome://settings/performance PerformanceMemory Saver When on, Chromium frees up memory from inactive tabs. This gives active tab…

基于Springboot的在线租房和招聘平台(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的在线租房和招聘平台&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结…

python基础——条件判断和循环【if,while,for,range】

&#x1f4dd;前言&#xff1a; 这篇文章主要讲解一下条件判断语句if和循环语句while&#xff0c;for在python中需要注意的地方。 建议已有一定了解&#xff08;对语句的执行逻辑清楚&#xff09;的读者观看&#xff0c;如果对条件判断和循环的执行逻辑不太清楚&#xff0c;也可…

bug_java

文章目录 1.创建Maven时&#xff1a; idea报错为&#xff1a;java&#xff1a;错误&#xff1a;不支持发行版本52. Springbot启动报错-类文件具有错误的版本 61.0, 应为 52.0 1.创建Maven时&#xff1a; idea报错为&#xff1a;java&#xff1a;错误&#xff1a;不支持发行版本…

遗传算法GA求解机器人栅格地图最短路径规划,可以自定义地图及起始点(提供MATLAB代码)

一、原理介绍 遗传算法是一种基于生物进化原理的优化算法&#xff0c;常用于求解复杂问题。在机器人栅格地图最短路径规划中&#xff0c;遗传算法可以用来寻找最优路径。 遗传算法的求解过程包括以下几个步骤&#xff1a; 1. 初始化种群&#xff1a;随机生成一组初始解&…

小程序网页view多行文本超出隐藏或显示省略号

实现效果&#xff1a; 限制两行&#xff0c;超出即显示省略号 实现&#xff1a;话不多说&#xff0c;展示代码 关键代码 .box{ width:100rpx; overflow:hidden; text-overflow: ellipsis;//超出省略号 display:-webkit-box; -webkit-line-clamp: 2;//显…

RabbitMQ - 03 - Work消息模型

目录 部署demo项目 什么是Work消息模型 实现Work消息模型 1.创建队列 2.生产者代码 3.消费者代码 4.配置yml 部署demo项目 通过消息队列demo项目进行练习 相关配置看此贴 http://t.csdnimg.cn/hPk2T 注意 生产者消费者的yml文件也要配置好 什么是Work消息模型 工作…

Arcgis小技巧【20】——属性表有东西,缩放至图层却看不到?

一、问题分析 这是一个看似正常的要素类数据&#xff0c;打开它的属性表&#xff0c;里面有一行要素&#xff1a; 说明这不是空数据。 回到地图界面&#xff0c;在图层列表中&#xff0c;右键单击&#xff0c;点击【缩放至图层】。 使用过这个功能的应该知道&#xff0c;点击…

快速上手:使用Hexo搭建并自定义个人博客

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

Linux常用操作命令-防火墙常用操作

一、防火墙常用操作 1、查看防火墙的状态&#xff1b; systemctl status firewalld 2、启动防火墙 systemctl start firewalld.service 3、开启某个端口&#xff0c;如8081端口&#xff0c;输入命令 firewall-cmd --zonepublic --add-port8088/tcp --permanent 4、删除某个…

Linux第74步_“设备树”下的LED驱动

使用新字符设备驱动的一般模板&#xff0c;以及设备树&#xff0c;驱动LED。 1、添加“stm32mp1_led”节点 打开虚拟机上“VSCode”&#xff0c;点击“文件”&#xff0c;点击“打开文件夹”&#xff0c;点击“zgq”&#xff0c;点击“linux”&#xff0c;点击“atk-mp1”&am…

AHU 数据库 实验四

【实验名称】 实验4 数据库的嵌套查询和集合查询 【实验目的】 1. 理解并掌握子查询的概念和作用&#xff1b; 2. 掌握DBMS 实现嵌套查询的基本方法和应用&#xff1b; 3. 掌握DBMS 实现集合查询的基本方法和应用&#xff1b; 4. 学习、掌握并熟练…

selenium-java 通过配置xml文件并发运行类或者方法

1、打开idea允许某个class类&#xff0c;可以在控制台看到运行路径的下的配置文件如下图&#xff1a; 2、将路径复制到本地路径中找到temp-testng-customsuite.xml文件 3、复制该文件到项目的根目录下&#xff0c;可以修改文件名称&#xff0c;如下图 4、如图所示&#xff0c;通…