当前位置: 首页 > news >正文

三、NetworkX工具包实战2——可视化【CS224W】(Datawhale组队学习)

请添加图片描述

开源内容:https://github.com/TommyZihao/zihao_course/tree/main/CS224W

子豪兄B 站视频:https://space.bilibili.com/1900783/channel/collectiondetail?sid=915098

斯坦福官方课程主页:https://web.stanford.edu/class/cs224w

NetworkX主页:https://networkx.org

文章目录

  • nx.draw可视化函数
  • 美国128城市交通关系无向图可视化
  • 有向图可视化模板
    • 初步可视化
    • 高级可视化设置
  • 国际象棋对局MultiDiGraph多路图可视化
    • 从连接表创建MultiDiGraph多路有向图
    • 连通域分析
    • 高级可视化
  • 自定义节点图标
  • 总结

nx.draw可视化函数

使用NetworkX自带的可视化函数nx.draw,绘制不同风格的图。设置节点尺寸、节点颜色、节点边缘颜色、节点坐标、连接颜色等。

# 图数据挖掘
import networkx as nximport numpy as np# 数据可视化
import matplotlib.pyplot as plt
%matplotlib inline# plt.rcParams['font.sans-serif']=['SimHei']  # 用来正常显示中文标签  
plt.rcParams['axes.unicode_minus']=False  # 用来正常显示负号

创建4x4网格图

G = nx.grid_2d_graph(4, 4)

原生可视化

pos = nx.spring_layout(G, seed=123)
nx.draw(G, pos)

在这里插入图片描述
不显示节点

nx.draw(G, pos, node_size=0, with_labels=False)

在这里插入图片描述
设置颜色

nx.draw(G,pos,node_color='#A0CBE2',      # 节点颜色edgecolors='red',          # 节点外边缘的颜色edge_color="blue",         # edge的颜色# edge_cmap=plt.cm.coolwarm, # 配色方案node_size=800,with_labels=False,width=3,
)

在这里插入图片描述
有向图

nx.draw(G.to_directed(),#变为有向图pos,node_color="tab:orange",node_size=400,with_labels=False,edgecolors="tab:gray",arrowsize=10,width=2,
)

在这里插入图片描述
设置每个节点的坐标
无向图

G = nx.Graph()
G.add_edge(1, 2)
G.add_edge(1, 3)
G.add_edge(1, 5)
G.add_edge(2, 3)
G.add_edge(3, 4)
G.add_edge(4, 5)
nx.draw(G, with_labels=True)

在这里插入图片描述

# 设置每个节点可视化时的坐标
pos = {1: (0, 0), 2: (-1, 0.3), 3: (2, 0.17), 4: (4, 0.255), 5: (5, 0.03)}# 设置其它可视化样式
options = {"font_size": 36,"node_size": 3000,"node_color": "white","edgecolors": "black", "linewidths": 5, # 节点线宽"width": 5, # edge线宽
}nx.draw_networkx(G, pos, **options)ax = plt.gca()
ax.margins(0.20) # 在图的边缘留白,防止节点被截断
plt.axis("off")
plt.show()

在这里插入图片描述
有向图

# 可视化时每一列包含的节点
left_nodes = [0, 1, 2]
middle_nodes = [3, 4]
right_nodes = [5, 6]
# 可视化时每个节点的坐标
pos = {n: (0, i) for i, n in enumerate(left_nodes)}
pos.update({n: (1, i + 0.5) for i, n in enumerate(middle_nodes)})
pos.update({n: (2, i + 0.5) for i, n in enumerate(right_nodes)})
pos

{0: (0, 0),
1: (0, 1),
2: (0, 2),
3: (1, 0.5),
4: (1, 1.5),
5: (2, 0.5),
6: (2, 1.5)}

nx.draw_networkx(G, pos, **options)ax = plt.gca()
ax.margins(0.20) # 在图的边缘留白,防止节点被截断
plt.axis("off")
plt.show()

在这里插入图片描述

G = nx.house_graph()
nx.draw(G, with_labels=True)

在这里插入图片描述

# 设置节点坐标
pos = {0: (0, 0), 1: (1, 0), 2: (0, 1), 3: (1, 1), 4: (0.5, 2.0)}
plt.figure(figsize=(10,8))
# 绘制“墙角”的四个节点
nx.draw_networkx_nodes(G, pos, node_size=3000, nodelist=[0, 1, 2, 3], node_color="tab:blue")
# 绘制“屋顶”节点
nx.draw_networkx_nodes(G, pos, node_size=2000, nodelist=[4], node_color="tab:orange")
# 绘制连接
nx.draw_networkx_edges(G, pos, alpha=0.5, width=6)
plt.axis("off") # 去掉坐标轴
plt.show()

在这里插入图片描述

美国128城市交通关系无向图可视化

参考文档

# 图数据挖掘
import networkx as nximport numpy as np# 数据可视化
import matplotlib.pyplot as plt
%matplotlib inline# plt.rcParams['font.sans-serif']=['SimHei']  # 用来正常显示中文标签  
plt.rcParams['axes.unicode_minus']=False  # 用来正常显示负号import gzip
import reimport warnings
warnings.simplefilter("ignore")

构建图

fh = gzip.open("knuth_miles.txt.gz", "r")G = nx.Graph()
G.position = {}
G.population = {}cities = []
for line in fh.readlines(): # 遍历文件中的每一行line = line.decode()if line.startswith("*"):  # 其它行,跳过continuenumfind = re.compile(r"^\d+")if numfind.match(line):  # 记录城市间距离的行dist = line.split()for d in dist:G.add_edge(city, cities[i], weight=int(d))i = i + 1else:  # 记录城市经纬度、人口的行i = 1(city, coordpop) = line.split("[")cities.insert(0, city)(coord, pop) = coordpop.split("]")(y, x) = coord.split(",")G.add_node(city)# assign position - Convert string to lat/longx = -float(x) / 100y = float(y) / 100G.position[city] = (x, y)pop = float(pop) / 1000G.population[city] = pop

查看图的基本信息

print(G)
G.nodes
G.position #128城市经纬度坐标
G.population #128城市人口数据
G.edges #128城市互联互通关系

我们可以查看任意两座城市之间的距离,以纽约到里士满的交通距离为例

G.edges[('Rochester, NY', 'Richmond, VA')]

{‘weight’: 486}

筛选出距离小于指定阈值的城市:即包含所有节点的GGG的子图

H = nx.Graph()
for v in G:H.add_node(v)
for (u, v, d) in G.edges(data=True):if d["weight"] < 800:H.add_edge(u, v)

可视化:节点颜色根据节点的度来确定,节点的大小根据节点的人口来确定

# 节点颜色-节点度
node_color = [float(H.degree(v)) for v in H]# 节点尺寸-节点人口
node_size = [G.population[v] for v in H]fig = plt.figure(figsize=(12, 10))
nx.draw(H,G.position,#每个节点的经纬度node_size=node_size,node_color=node_color,with_labels=False,
)
plt.show()

在这里插入图片描述

有向图可视化模板

NetworkX可视化有向图的代码模板。

# 图数据挖掘
import networkx as nximport numpy as np# 数据可视化
import matplotlib.pyplot as plt
%matplotlib inline# plt.rcParams['font.sans-serif']=['SimHei']  # 用来正常显示中文标签  
plt.rcParams['axes.unicode_minus']=False  # 用来正常显示负号
import matplotlib as mpl

初步可视化

seed = 13648
G = nx.random_k_out_graph(10, 3, 0.5, seed=seed)
pos = nx.spring_layout(G, seed=seed)
nx.draw(G, pos, with_labels=True)

在这里插入图片描述

高级可视化设置

# 节点大小
node_sizes = [12 + 10 * i for i in range(len(G))]# 节点颜色
M = G.number_of_edges()
edge_colors = range(2, M + 2)# 节点透明度
edge_alphas = [(5 + i) / (M + 4) for i in range(M)]# 配色方案
cmap = plt.cm.plasma
# cmap = plt.cm.Bluesplt.figure(figsize=(10,8))# 绘制节点
nodes = nx.draw_networkx_nodes(G, pos, node_size=node_sizes, node_color="indigo")# 绘制连接
edges = nx.draw_networkx_edges(G,pos,node_size=node_sizes,   # 节点尺寸arrowstyle="->",        # 箭头样式arrowsize=20,           # 箭头尺寸edge_color=edge_colors, # 连接颜色edge_cmap=cmap,         # 连接配色方案width=4                # 连接线宽
)# 设置每个连接的透明度
for i in range(M):edges[i].set_alpha(edge_alphas[i])# 调色图例
pc = mpl.collections.PatchCollection(edges, cmap=cmap)
pc.set_array(edge_colors)
plt.colorbar(pc)ax = plt.gca()
ax.set_axis_off()
plt.show()

在这里插入图片描述

国际象棋对局MultiDiGraph多路图可视化

分析1886-1985年的国际象棋对局数据,绘制多路有向图,节点尺寸为胜利个数,连接宽度为对局个数。
参考文档

# 图数据挖掘
import networkx as nx# 数据可视化
import matplotlib.pyplot as plt
%matplotlib inline# plt.rcParams['font.sans-serif']=['SimHei']  # 用来正常显示中文标签  
plt.rcParams['axes.unicode_minus']=False  # 用来正常显示负号

导入数据,构建MultiDiGraph

从连接表创建MultiDiGraph多路有向图

import pandas as pd
df = pd.read_csv('WCC.csv')
df

在这里插入图片描述

G = nx.from_pandas_edgelist(df, 'White', 'Black', edge_attr=True, create_using=nx.MultiDiGraph())
print('棋手(节点)个数', G.number_of_nodes())
print('棋局(连接)个数', G.number_of_edges())

棋手(节点)个数 25
棋局(连接)个数 685

# 所有节点
G.nodes#所有连接(带特征)
G.edges(data=True)

我们可以查找到任意两个棋手之间的所有对局

# 两个棋手的所有棋局
G.get_edge_data('Zukertort, Johannes H', 'Steinitz, Wilhelm')

初步可视化

pos = nx.spring_layout(G, seed=10)
nx.draw(G, pos)

在这里插入图片描述

连通域分析

# 将G转为无向图,分析连通域
H = G.to_undirected()
for each in nx.connected_components(H):print('连通域')print(H.subgraph(each))print('包含节点')print(each)print('\n')

连通域
MultiGraph with 22 nodes and 304 edges
包含节点
{‘Botvinnik, Mikhail M’, ‘Petrosian, Tigran V’, ‘Schlechter, Carl’, ‘Spassky, Boris V’, ‘Bogoljubow, Efim D’, ‘Keres, Paul’, ‘Gunsberg, Isidor A’, ‘Steinitz, Wilhelm’, ‘Chigorin, Mikhail I’, ‘Tarrasch, Siegbert’, ‘Bronstein, David I’, ‘Janowski, Dawid M’, ‘Capablanca, Jose Raul’, ‘Lasker, Emanuel’, ‘Tal, Mikhail N’, ‘Smyslov, Vassily V’, ‘Zukertort, Johannes H’, ‘Alekhine, Alexander A’, ‘Marshall, Frank J’, ‘Euwe, Max’, ‘Fischer, Robert J’, ‘Reshevsky, Samuel H’}

连通域 MultiGraph with 3 nodes and 49 edges 包含节点 {‘Kasparov, Gary’,
‘Karpov, Anatoly’, ‘Korchnoi, Viktor L’}

高级可视化

# 将G转为无向-单连接图
H = nx.Graph(G)

我们可以查找到任意两个棋手之间的所有对局

# 两个棋手的所有棋局
len(G.get_edge_data('Zukertort, Johannes H', 'Steinitz, Wilhelm'))
# 两个棋手节点之间的 连接宽度 与 棋局个数 成正比
edgewidth = [len(G.get_edge_data(u, v)) for u, v in H.edges()]
# 棋手节点的大小 与 赢棋次数 成正比
wins = dict.fromkeys(G.nodes(), 0) # 生成每个棋手作为key的dict
for (u, v, d) in G.edges(data=True):r = d["Result"].split("-")if r[0] == "1":wins[u] += 1.0elif r[0] == "1/2":wins[u] += 0.5wins[v] += 0.5else:wins[v] += 1.0
nodesize = [wins[v] * 50 for v in H]# 布局
pos = nx.kamada_kawai_layout(H)# 手动微调节点的横坐标(越大越靠右)、纵坐标(越大越靠下)
pos["Reshevsky, Samuel H"] += (0.05, -0.10)
pos["Botvinnik, Mikhail M"] += (0.03, -0.06)
pos["Smyslov, Vassily V"] += (0.05, -0.03)fig, ax = plt.subplots(figsize=(12, 12))# 可视化连接
nx.draw_networkx_edges(H, pos, alpha=0.3, width=edgewidth, edge_color="m")# 可视化节点
nx.draw_networkx_nodes(H, pos, node_size=nodesize, node_color="#210070", alpha=0.9)# 节点名称文字说明
label_options = {"ec": "k", "fc": "white", "alpha": 0.7}
nx.draw_networkx_labels(H, pos, font_size=14, bbox=label_options)# 标题和图例
font = {"fontname": "Helvetica", "color": "k", "fontweight": "bold", "fontsize": 16}
ax.set_title("World Chess Championship Games: 1886 - 1985", font)
# 图例字体颜色
font["color"] = "r"# 文字说明
ax.text(0.80,0.10,"edge width = # games played",horizontalalignment="center",transform=ax.transAxes,fontdict=font,
)
ax.text(0.80,0.06,"node size = # games won",horizontalalignment="center",transform=ax.transAxes,fontdict=font,
)# 调整图的大小,提高可读性
ax.margins(0.1, 0.05)
fig.tight_layout()
plt.axis("off")
plt.show()

在这里插入图片描述

自定义节点图标

参考文档

# 图数据挖掘
import networkx as nx# 数据可视化
import matplotlib.pyplot as plt
%matplotlib inline# plt.rcParams['font.sans-serif']=['SimHei']  # 用来正常显示中文标签  
plt.rcParams['axes.unicode_minus']=False  # 用来正常显示负号import PIL

载入自定义的图标

# 图标下载网站
# www.materialui.co
# https://www.flaticon.com/
# 服务器:https://www.flaticon.com/free-icon/database-storage_2906274?term=server&page=1&position=8&page=1&position=8&related_id=2906274&origin=search
# 笔记本电脑:https://www.flaticon.com/premium-icon/laptop_3020826?term=laptop&page=1&position=13&page=1&position=13&related_id=3020826&origin=search
# 路由器:https://www.flaticon.com/premium-icon/wifi_1183657?term=router&page=1&position=3&page=1&position=3&related_id=1183657&origin=searchicons = {'router': 'database-storage.png','switch': 'wifi.png','PC': 'laptop.png',
}# 载入图像
images = {k: PIL.Image.open(fname) for k, fname in icons.items()}
images

{‘router’: <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=512x512>,
‘switch’: <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=512x512>,
‘PC’: <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=512x512>}

创建图

# 创建空图
G = nx.Graph()# 创建节点
G.add_node("router", image=images["router"])
for i in range(1, 4):G.add_node(f"switch_{i}", image=images["switch"])for j in range(1, 4):G.add_node("PC_" + str(i) + "_" + str(j), image=images["PC"])# 创建连接
G.add_edge("router", "switch_1")
G.add_edge("router", "switch_2")
G.add_edge("router", "switch_3")
for u in range(1, 4):for v in range(1, 4):G.add_edge("switch_" + str(u), "PC_" + str(u) + "_" + str(v))
nx.draw(G, with_labels=True)

在这里插入图片描述

fig, ax = plt.subplots()# 图片尺寸(相对于 X 轴)
icon_size = (ax.get_xlim()[1] - ax.get_xlim()[0]) * 0.04
icon_center = icon_size / 2.0pos = nx.spring_layout(G, seed=1)
fig, ax = plt.subplots(figsize=(14,10))# 绘制连接
# min_source_margin 和 min_target_margin 调节连接端点到节点的距离
nx.draw_networkx_edges(G,pos=pos,ax=ax,arrows=True,arrowstyle="-",min_source_margin=30,min_target_margin=30,
)# 给每个节点添加各自的图片
for n in G.nodes:xf, yf = ax.transData.transform(pos[n]) # data坐标 转 display坐标xa, ya = fig.transFigure.inverted().transform((xf, yf)) # display坐标 转 figure坐标a = plt.axes([xa - icon_center, ya - icon_center, icon_size, icon_size])a.imshow(G.nodes[n]["image"])a.axis("off")plt.show()

在这里插入图片描述

总结

本文主要介绍了使用NetworkX自带的可视化函数nx.draw,绘制不同风格的图。设置节点尺寸、节点颜色、节点边缘颜色、节点坐标、连接颜色等,并介绍了有向图可视化的模板和如何自定义节点坐标,最后以【美国128城市交通关系无向图可视化】和【国际象棋对局MultiDiGraph多路图可视化】实战演示了如何利用NetworkX工具包解决实际问题。

相关文章:

三、NetworkX工具包实战2——可视化【CS224W】(Datawhale组队学习)

开源内容&#xff1a;https://github.com/TommyZihao/zihao_course/tree/main/CS224W 子豪兄B 站视频&#xff1a;https://space.bilibili.com/1900783/channel/collectiondetail?sid915098 斯坦福官方课程主页&#xff1a;https://web.stanford.edu/class/cs224w NetworkX…...

【MySQL】MySQL 架构

一、MySQL 架构 C/S 架构&#xff0c;即客户端/服务器架构。服务器程序直接和我们存储的数据打交道&#xff0c;多个客户端连接这个服务器程序。客户端发送请求&#xff0c;服务器响应请求。 MySQL 数据库实例 &#xff1a;即 MySQL 服务器的进程 &#xff08;我们使用任务管理…...

Python日期时间模块

Python 提供了 日期和时间模块用来处理日期和时间&#xff0c;还可以用于格式化日期和时间等常见功能。 时间间隔是以秒为单位的浮点小数。每个时间戳都以自从 1970 年 1 月 1 日午夜&#xff08;历元&#xff09;经过了多长时间来表示。 一、time模块使用 Time 模块包含了大…...

学以致用——植物信息录入1.0(selenium+pandas+os+tkinter)

目的 书接上文&#xff0c;学以致用——植物信息录入&#xff08;seleniumpandasostkinter) 更新要点&#xff1a; tkinter界面&#xff1a;自动登录、新增&#xff08;核心功能&#xff09;、文件夹选择、流程台selenium自动化操作&#xff1a;验证码识别excel数据&#xf…...

什么是压敏电阻

下面的这些都是压敏电阻&#xff0c;常常用在一些电源和信号的浪涌防护电路中。这个是它的电路符号&#xff0c;电路中常用RV表示。当压敏电阻两端电压小于压敏电压时&#xff0c;压敏电阻相当于一个阻值非常大的电阻。当压敏电阻两端电压大于压敏电压时&#xff0c;压敏电阻相…...

Leetcode.901 股票价格跨度

题目链接 Leetcode.901 股票价格跨度 Rating &#xff1a; 1709 题目描述 设计一个算法收集某些股票的每日报价&#xff0c;并返回该股票当日价格的 跨度 。 当日股票价格的 跨度 被定义为股票价格小于或等于今天价格的最大连续日数&#xff08;从今天开始往回数&#xff0c;…...

vue入门(四)组件基础,$emits简单用法

上一篇&#xff1a;vue入门&#xff08;三&#xff09;事件&#xff08;方法&#xff09;处理、侦听器、模板引用 1.组件最基础的用法&#xff1a; 首先有一个button.vue的组件&#xff0c;里面只画了一个按钮 button.vue: <script> export default({data(){return{but…...

VBA提高篇_27 OptionBOX_CheckBox_Frame_Image_VBA附加控件

文章目录1.单选按钮OptionBOX:2.复选框CheckBox:3.框架Frame:4.图像Image: (loadPictrue)5. VBA附加控件:6. 适用于很多控件的重要属性:1.单选按钮OptionBOX: 默认时,同一窗体的所有单选按钮均属于同一组,只能选中一个 可通过Frame控件进行分组解决. 2.复选框CheckBox: 一次可以…...

STM32开发(11)----CubeMX配置独立看门狗(IWDG)

CubeMX配置独立看门狗&#xff08;IWDG&#xff09;前言一、独立看门狗的介绍二、实验过程1.STM32CubeMX配置独立看门狗2.代码实现3.硬件连接4.实验结果总结前言 本章介绍使用STM32CubeMX对独立看门狗定时器进行配置的方法。门狗本质上是一个定时器&#xff0c;提供了更高的安…...

医疗方案 | 星辰天合入选“2022智慧新医信优秀解决方案”

近日&#xff0c;由 HC3i数字医疗网主办的《数字化转型驱动下的医院高质量发展论坛》暨 2022 智慧新医信优秀解决方案发布仪式在线上召开。XSKY星辰天合的“智慧医疗软件定义数据基础设施”解决方案成功入选 2022 智慧新医信优秀解决方案&#xff0c;。此次论坛由 HC3i 数字医疗…...

【系统服务实战】tomcat服务的安装实战

未来要更新的专栏&#xff08;此表格后面会继续完善&#xff09; 专栏系列学习路线完成情况云原生系列linux基本功系列-基础命令汇总已更新51个命令云原生系列linux基本功系列-系统服务实战正在更新文章目录前言一. tomcat的概述1.1 什么是tomcat1.2 tomcat的官网二. tomcat单…...

【图文详解】Unity存储游戏数据的几种方法

Unity3D存储游戏数据的方式1 PlayerPrefs: Unity自带的一种简单的键值存储系统2 ScriptableObject: Unity中最灵活的数据管理工具2.1 如何手动创建和修改数据文件2.2 ScriptableObject优缺点总结3 JSON: 轻量级的数据交换格式3.1 序列化与反序列化3.2 用JsonUtility对对象进行序…...

SESAM 安装教程

SESAM &#xff08;Super Element Structure Analysis Module&#xff09;是由挪威船级社&#xff08;DNV-GL&#xff09;开发的一款有限元分析&#xff08;FEA&#xff09;系统&#xff0c;它以 GeniE、HydroD 和 DeepC 等模块为核心&#xff0c;主要用于海工结构的强度评估、…...

语言文件操作

&#x1f331;博客主页&#xff1a;大寄一场. &#x1f331;系列专栏&#xff1a;C语言学习笔记 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 目录 前言 C语言中的文件打开和关闭 文件指针 文件的打开和关闭 fclose 文件的顺序读写 fseek ftell …...

Java面试题--熔断和降级的区别

熔断和降级都是系统自我保护的一种机制&#xff0c;但二者又有所不同&#xff0c;它们的区别主要体现在以下几点&#xff1a; 概念不同 触发条件不同 归属关系不同 1.概念不同 1.1熔断概念 “熔断”一词早期来自股票市场。熔断&#xff08;Circuit Breaker&#xff09;也…...

阅读笔记5——深度可分离卷积

一、标准卷积 标准卷积在卷积时&#xff0c;同时考虑了特征图的区域和通道信息。 标准卷积的过程如图1-1所示&#xff0c;假设输入特征图的channel3&#xff0c;则每个卷积核的channel都为3&#xff0c;每个卷积核的3个channel对应提取输入特征图的3个channel的特征&#xff08…...

Microsoft Dynamics 365:导入License到服务层,通过Business Central Administration Shell

本文主要是Microsoft Dynamics 365的License导入的图解干货&#xff0c;不多赘述&#xff0c;直接上图&#xff1a;第一步&#xff1a;准备好的License文件放在你喜欢的目录下第二步&#xff1a;到开始程序里找到并打开 Business Central Administration Shell3.第三步&#xf…...

centos6.10安装FastDfs出错的问题

在centos6.10虚拟机安装dfs文件服务器时&#xff0c;安装报错&#xff0c;报错为&#xff1a; gcc: error trying to exec cc1’: execvp: 没有那个文件或目录 1.ping www.baidu.con 排查网络是否通 2.yum update 排查yum源是否可用 3.yum源地址不可用时&#xff0c;修改yu…...

基础组件之内存池

内存池技术 操作系统在运行进程的过程中&#xff0c;会产生内存碎片&#xff0c;降低了内存的使用率。内存池技术就是为了解决/减少内存碎片的一种方法&#xff0c;内部底层的具体实现根据不同业务场景使用不要的方式&#xff0c;以下是一种好理解的方式&#xff0c;供大家一起…...

前端面试题--了解并简单介绍一下typescript

前端面试题–了解并简单介绍一下typescript TypeScript是JavaScript的超集&#xff0c;具有可选的类型并可以编译为纯JavaScript。 从技术上讲TypeScript就是具有静态类型的 JavaScript 。 向JavaScript添加静态类型的原因是什么&#xff1f;我想原因至少有三个&#xff1a; …...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...