【数据可视化】动手用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.hqwc.cn/news/526729.html

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

相关文章

腾讯云8核16g服务器性能好不好?亲测并发数支持人数

腾讯云8核16G轻量服务器CPU性能如何&#xff1f;18M带宽支持多少人在线&#xff1f;轻量应用服务器具有100%CPU性能&#xff0c;18M带宽下载速度2304KB/秒&#xff0c;折合2.25M/s&#xff0c;系统盘为270GB SSD盘&#xff0c;月流量3500GB&#xff0c;折合每天116.6GB流量&…

diffusion model(十三):DiT技术小结

infopaperhttps://arxiv.org/abs/2212.09748githubhttps://github.com/facebookresearch/DiT/tree/main个人博客主页http://myhz0606.com/article/ditcreate date2024-03-08 阅读前需要具备以下前置知识&#xff1a; DDPM(扩散模型基本原理)&#xff1a;知乎地址 个人博客地址…

Java 抽象类和接口

登神长阶 第三阶 抽象类和接口 &#x1f340;&#x1f340;&#x1f340;&#x1f340;&#x1f340;&#x1f340;&#x1f340;&#x1f340;&#x1f340;&#x1f340;&#x1f340;&#x1f340;&#x1f340;&#x1f340;&#x1f340;&#x1f340;&#x1f340;&…

分割模型TransNetR的pytorch代码学习笔记

这个模型在U-net的基础上融合了Transformer模块和残差网络的原理。 论文地址&#xff1a;https://arxiv.org/pdf/2303.07428.pdf 具体的网络结构如下&#xff1a; 网络的原理还是比较简单的&#xff0c; 编码分支用的是预训练的resnet模块&#xff0c;解码分支则重新设计了。…

Masked Generative Distillation(MGD)2022年ECCV

Masked Generative Distillation&#xff08;MGD&#xff09;2022年ECCV 摘要 **目前的蒸馏算法通常通过模仿老师的输出来提高学生的表现。本文表明&#xff0c;教师还可以通过引导学生特征恢复来提高学生的代表性。从这个角度来看&#xff0c;我们提出的掩模生成蒸馏&#x…

先进电机技术 —— 高速电机与低速电机

一、背景 高速电机是指转速远高于一般电机的电动机&#xff0c;通常其转速在每分钟几千转至上万转甚至几十万转以上。这类电机具有功率密度高、响应速度快、输出扭矩大等特点&#xff0c;在航空航天、精密仪器、机器人、电动汽车、高端装备制造等领域有着广泛的应用。 高速电…

无人机生态环境监测、图像处理与GIS数据分析

构建“天空地”一体化监测体系是新形势下生态、环境、水文、农业、林业、气象等资源环境领域的重大需求&#xff0c;无人机生态环境监测在一体化监测体系中扮演着极其重要的角色。通过无人机航空遥感技术可以实现对地表空间要素的立体观测&#xff0c;获取丰富多样的地理空间数…

跨平台大小端判断与主机节序转网络字节序使用

1.macOS : 默认使用小端 ,高位使用高地址,转换为网络字节序成大端 #include <iostream> #include <arpa/inet.h> int main() {//大小端判断union{short s;char c[sizeof(short)];}un;un.s = 0x0102;printf("低地址:%d,高地址:%d\n",un.c[0],un.c[1]);if …

灯塔批量添加指纹信息

攻击地址https://github.com/loecho-sec/ARL-Finger-ADD 指纹文件https://github.com/lemonlove7/EHole_magic/blob/main/finger.json 成功导入可以看到

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

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

采用 Amazon DocumentDB 和 Amazon Bedrock 上的 Claude 3 构建游戏行业产品推荐

前言 大语言模型&#xff08;LLM&#xff09;自面世以来即展示了其创新能力&#xff0c;但 LLM 面临着幻觉等挑战。如何通过整合外部数据库的知识&#xff0c;检索增强生成&#xff08;RAG&#xff09;已成为通用和可行的解决方案。这提高了模型的准确性和可信度&#xff0c;特…

【个人开发】llama2部署实践(三)——python部署llama服务(基于GPU加速)

1.python环境准备 注&#xff1a;llama-cpp-python安装一定要带上前面的参数安装&#xff0c;如果仅用pip install装&#xff0c;启动服务时并没将模型加载到GPU里面。 # CMAKE_ARGS"-DLLAMA_METALon" FORCE_CMAKE1 pip install llama-cpp-python CMAKE_ARGS"…