ProPlot 基本语法及特点
文章目录
- 简介
- 多子图绘制处理
- 共享轴标签
- “跨度”轴标签
- 多子图序号的绘制
- 更简单的颜色条和图例
- 更加美观的颜色和字体
简介
科研论文配图多图层元素(字体、坐标轴、图例等)的绘制条件提出了更高要求,我们需要更改 Matplotlib 和 Seaborn 中的多个绘制参数,特别是在绘制含有多个子图的复杂图形时,容易造成绘制代码冗长。
作为一个简洁的 Matplotlib 包装器,ProPlot 库是 Matplotlib 面向对象绘图方法(object-oriented interface)的高级封装,整合了 cartopy/Basemap 地图库、xarray 和 pandas,可弥补 Matplotlib 的部分缺陷。ProPlot 可以让 Matplotlib 爱好者拥有更加顺滑的绘图体验。
多子图绘制处理
共享轴标签
在使用 Matplotlib 绘制多子图时,不可避免地要进行轴刻度标签、轴标签、颜色条(colorbar)和图例的重复绘制操作,导致绘图代码冗长。此外,我们还需要为每个子图添加顺序标签(如 a、b、c 等)。ProPlot 可以直接通过其内置方法来绘制不同样式的子图标签,而 Matplotlib 则需要通过自定义函数进行绘制。
ProPlot 中的 figure ()
函数的 sharex
、sharey
、share
参数可用于控制不同的轴标签样式,它们的可选值及说明如下:
下面是使用 ProPlot 绘制的多子图轴标签共享示意图,其中
- (a)为无共享轴标签样式;
- (b)为设置 Y 轴共享标签样式;
- (c)展示了设置 Y 轴共享方式为 Limits 时的样式,可以看出,每个子图的刻度范围被强制设置为相同,导致有些子图显示不全;
- (d)展示了设置 Y 轴共享方式为 True 时的样式,此时,轴标签、刻度标签都实现了共享。
import pandas as pd
import numpy as np
import proplot as pplt
import matplotlib.pyplot as pltN = 50
M = 40
state = np.random.RandomState(51423)
cycle = pplt.Cycle('grays', M, left=0.1, right=0.8)datas = []
for scale in (1, 3, 7, 0.2):data = scale * (state.rand(N, M) - 0.5).cumsum(axis=0)[N // 2:, :]datas.append(data)# Plots with different sharing and spanning settings
# Note that span=True and share=True are the defaults
spans = (False, False, False, False)
shares = (False, 'labels', 'limits', True)
for i, (span, share) in enumerate(zip(spans, shares)):# note: there is shareyfig = pplt.figure(refaspect=1, refwidth=1.06, spanx=span, sharey=share)axs = fig.subplots(ncols=3)for ax, data in zip(axs, datas):on = ('off', 'on')[int(span)]ax.plot(data, cycle=cycle)ax.format(grid=False, xlabel='X labels', ylabel='shared axis',#suptitle=f'Sharing mode {share!r} (level {i}) with spanning labels {on}')fig.save(r'\第2章 绘制工具及其重要特征\Proplot_subplot_share'+str(share)+'.png', bbox_inches='tight',dpi=600)fig.save(r'\第2章 绘制工具及其重要特征\\Proplot_subplot_share'+str(share)+'.pdf', bbox_inches='tight')plt.show()
“跨度”轴标签
figure()
函数中的 spanx
、spany
和 span
参数用于控制是否对 X 轴、Y 轴或两个轴使用“跨度”轴标签,即当多个子图的 X 轴、Y 轴标签相同时,使用一个轴标签替代即可。
import pandas as pd
import numpy as np
import proplot as pplt
import matplotlib.pyplot as pltstate = np.random.RandomState(51423)# Plots with minimum and maximum sharing settings
# Note that all x and y axis limits and ticks are identical
spans = (True, True)
shares = (True, 'all')
titles = ('Minimum sharing', 'Maximum sharing')
for span, share, title in zip(spans, shares, titles):fig = pplt.figure(refwidth=1, span=span, share=share)axs = fig.subplots(nrows=2, ncols=4)for ax in axs:data = (state.rand(100, 20) - 0.4).cumsum(axis=0)ax.plot(data, cycle='grays')axs.format(xlabel='xlabel', ylabel='ylabel',grid=False, xticks=25, yticks=5,labelsize=13)
fig.save(r'\第2章 绘制工具及其重要特征\图2-3-2 Proplot_subplot_span.png', bbox_inches='tight',dpi=600)
fig.save(r'\第2章 绘制工具及其重要特征\图2-3-2 Proplot_subplot_span.pdf', bbox_inches='tight')plt.show()
多子图序号的绘制
在科研论文配图中存在多个子图的情况下,一项工作是对每个子图进行序号标注。ProPlot 库为绘图对象(figure.Figure 和 axes.Axes)提供了灵活的 format ()
方法,该方法可用于绘制不同的子图序号样式和位置。
format()
函数中的位置参数(abcloc)的可选值如下:
其中,子图序号 G ~ I 添加了背景边框,这是通过将 format ()
函数的参数 abcbbox
设置为 True 实现的。此外,参数 abcborder
、abc_kw
和 abctitlepad
分别用于控制子图序号的文本边框、文本属性(颜色、粗细等)、子图序号与子图标题间距属性。
import pandas as pd
import numpy as np
import proplot as pplt
import matplotlib.pyplot as pltfig = pplt.figure(figsize=(8,5.5),space=1, refwidth='10em')
axs = fig.subplots(nrows=3, ncols=3)
locs = ("c","l","r","lc","uc","ur","ul","ll","lr")
abcs = ("a","a.","(a)","[a]","(a","A","A.","(A)","(A.)")
axs.format(abcsize=16,xlabel='x axis', ylabel='y axis',labelsize=18)
axs[-3:].format(abcbbox=True)
axs[0, 0].format(abc="a", abcloc="c",abcborder=True)
axs[0, 1].format(abc="a.", abcloc="l")
axs[0, 2].format(abc="(a)", abcloc="r")
axs[1, 0].format(abc="[a]", abcloc="lc",facecolor='gray5')
axs[1, 1].format(abc="(a", abcloc="uc",facecolor='gray5')
axs[1, 2].format(abc="A", abcloc="ur",facecolor='gray5')
axs[2, 0].format(abc="A.", abcloc="ul",)
axs[2, 1].format(abc="(A)", abcloc="ll")
axs[2, 2].format(abc="(A.)", abcloc="lr")
fig.save(r'\第2章 绘制工具及其重要特征\\图2-3-3 Proplot_abc.png', bbox_inches='tight',dpi=600)
fig.save(r'\第2章 绘制工具及其重要特征\\图2-3-3 Proplot_abc.pdf', bbox_inches='tight')
plt.show()
更多关于子图属性的添加和修改示例见 ProPlot 官方教程。
更简单的颜色条和图例
在使用 Matplotlib 的过程中,在子图外部绘制图例有时比较麻烦。通常,我们需要手动定位图例并调整图形和图例之间的间距,为图例在绘图对象中腾出绘制空间。此外,在子图外部绘制颜色条(colorbar)时,如
fig.colorbar (..., ax=ax)
,需要从父图中借用部分空间,这可能导致具有多个子图的图形对象的显示出现不对称问题。而在 Matplotlib 中,绘制插入绘图对象内部的颜色条和生成宽度一致的子图外部颜色条通常也很困难,因为插入的颜色条会过宽或过窄,与整个子图存在比例不协调等问题。
colorbar 即主图旁一个长条状的小图,能够辅助表示主图中colormap 的颜色组成和颜色与数值的对应关系。
ProPlot 库中有一个专门用于绘制单个子图或多个连续子图的颜色条和图例的简单框架,该框架将位置参数传递给 ProPlot 的 axes.Axes.colorbar
或 axes.Axes.legend
,完成特定子图不同位置颜色条或图例的绘制。
import pandas as pd
import numpy as np
import proplot as pplt
import matplotlib.pyplot as pltfig = pplt.figure(share=False, refwidth=2.3)# Colorbars
ax = fig.subplot(121)
state = np.random.RandomState(51423)
m = ax.heatmap(state.rand(10, 10), colorbar='t', cmap='grays')
ax.colorbar(m, loc='r')
ax.colorbar(m, loc='ll', label='colorbar label')
ax.format(title='Axes colorbars')# Legends
ax = fig.subplot(122)
ax.format(title='Axes legends', titlepad='0em')
hs = ax.plot((state.rand(10, 5) - 0.5).cumsum(axis=0), linewidth=3,cycle='ggplot', legend='t',labels=list('abcde'), legend_kw={'ncols': 5, 'frame': False}
)
ax.legend(hs, loc='r', ncols=1, frame=False)
ax.legend(hs, loc='ll', label='legend label')
fig.format(abc="(a)", abcloc="ul",abcsize=15, xlabel='xlabel', ylabel='ylabel')fig.save('\第2章 绘制工具及其重要特征\图2-3-4 Proplot_axes_cb_legend.png', bbox_inches='tight',dpi=600)
fig.save('\第2章 绘制工具及其重要特征\图2-3-4 Proplot_axes_cb_legend.pdf', bbox_inches='tight')
plt.show()
想要沿图形边缘绘制颜色条或图例,使用 proplot.figure.Figure.colorbar
和 proplot.figure.Figure.legend
即可。
import pandas as pd
import numpy as np
import proplot as pplt
import matplotlib.pyplot as pltstate = np.random.RandomState(51423)
fig, axs = pplt.subplots(ncols=2, nrows=2, order='F', refwidth=1.7, wspace=2.5, share=False
)# Plot data
data = (state.rand(50, 50) - 0.1).cumsum(axis=0)
for ax in axs[:2]:m = ax.contourf(data, cmap='grays', extend='both')
hs = []
colors = pplt.get_colors('grays', 5)
for abc, color in zip('ABCDEF', colors):data = state.rand(10)for ax in axs[2:]:h, = ax.plot(data, color=color, lw=3, label=f'line {abc}')hs.append(h)# Add colorbars and legends
fig.colorbar(m, length=0.8, label='colorbar label', loc='b', col=1, locator=5)
fig.colorbar(m, label='colorbar label', loc='l')
fig.legend(hs, ncols=2, center=True, frame=False, loc='b', col=2)
fig.legend(hs, ncols=1, label='legend label', frame=False, loc='r')
fig.format(abc='A', abcloc='ul')
for ax, title in zip(axs, ('2D {} #1', '2D {} #2', 'Line {} #1', 'Line {} #2')):ax.format(xlabel='xlabel', title=title.format('dataset'))fig.save(r'\第2章 绘制工具及其重要特征\Proplot_figure_cb_legend.png', bbox_inches='tight',dpi=600)
fig.save(r'\第2章 绘制工具及其重要特征\Proplot_figure_cb_legend.pdf', bbox_inches='tight')
plt.show()
更加美观的颜色和字体
科学可视化展示中的一个常见问题是使用像“jet”这样的存在误导的颜色映射(colormap)去映射对应数值,这种颜色映射在色相、饱和度和亮度上都存在明显的视觉缺陷。Matplotlib 中可供选择的颜色映射选项较少,仅存在几个色相相似的颜色映射,无法应对较复杂的数值映射场景。
ProPlot 库封装了大量的颜色映射选项,不但提供了来自 Seaborn、cmOcean、SciVisColor 等的拓展包和 Scientific colour maps 等项目中的多个颜色映射选项,而且定义了一些默认颜色选项和一个用于生成新颜色条的 PerceptualColormap 类。
Matplotlib 的默认绘图字体为 DejaVu Sans,这种字体是开源的,但是,从美学角度来说,它并不太讨人喜欢。ProPlot 库还附带了其他几种无衬线字体和整个 TeX Gyre 字体系列,这些字体更加符合一些科技期刊对科研论文配图的绘制要求。
下面为使用 ProPlot 的不同颜色映射选项绘制的不同颜色映射的效果图。
(a)为灰色(grays)系颜色映射
(b)为 Matplotlib 默认的 viridis 颜色映射
(c)为 Seaborn 中的 mako 颜色映射
(d)为 ProPlot 中的 marine 颜色映射
(e)为 cmOcean 中的 dense 颜色映射
(f)为 Scientific colour maps 中的 batlow 颜色映射。
import pandas as pd
import numpy as np
import proplot as pplt
import matplotlib.pyplot as pltfig = pplt.figure(share=False, refwidth=2.3)# Colorbars
ax = fig.subplot(231)
state = np.random.RandomState(51423)
data = 1 + (state.rand(12, 10) - 0.45).cumsum(axis=0)
m = ax.heatmap(state.rand(10, 10), cmap='grays')
ax.colorbar(m, loc='ll', label='grays colorbar')
ax = fig.subplot(232)
m = ax.heatmap(state.rand(10, 10), cmap='viridis')
ax.colorbar(m, loc='ll', label='viridis colorbar')ax = fig.subplot(233)
m = ax.heatmap(state.rand(10, 10), cmap='mako')
ax.colorbar(m, loc='ll', label='mako colorbar')ax = fig.subplot(234)
m = ax.heatmap(state.rand(10, 10), cmap='marine')
ax.colorbar(m, loc='ll', label='marine colorbar')ax = fig.subplot(235)
m = ax.heatmap(state.rand(10, 10), cmap='dense')
ax.colorbar(m, loc='ll', label='dense colorbar')ax = fig.subplot(236)
m = ax.heatmap(state.rand(10, 10), cmap='batlow')
ax.colorbar(m, loc='ll', label='batlow colorbar')fig.format(abc="(a)", abcloc="ul",abcsize=15,xlabel='xlabel', ylabel='ylabel',labelsize=15)fig.save(r'\第2章 绘制工具及其重要特征\图2-3-6 Proplot_colormaps.png', bbox_inches='tight',dpi=600)
fig.save(r'\第2章 绘制工具及其重要特征\图2-3-6 Proplot_colormaps.pdf', bbox_inches='tight')
plt.show()
更多颜色映射的绘制请参考 ProPlot 官方教程。
下面是 ProPlot 中部分字体绘制的可视化结果,其中(a)(b)(c)中展示的 3 种字体是科研论文配图绘制中的常用字体。
import pandas as pd
import numpy as np
import proplot as pplt
import matplotlib.pyplot as plt
from proplot import rc# Sample data
state = np.random.RandomState(51423)
data = state.rand(6, 6)
data = pd.DataFrame(data, index=pd.Index(['a', 'b', 'c', 'd', 'e', 'f']))fig = pplt.figure(share=False, refwidth=2.3)
# 参数 rc 则用于覆盖预设样式字典中的值的参数映射,只更新样式中的一部分参数。
rc["font.family"] = "Times New Roman"
ax = fig.subplot(231)
m = ax.heatmap(data, cmap='grays',labels=True, precision=2, labels_kw={'weight': 'bold'}
)
ax.format(title='Times New Roman Font')rc["font.family"] = "TeX Gyre Schola"
ax = fig.subplot(232)
m = ax.heatmap(data, cmap='grays',labels=True, precision=2, labels_kw={'weight': 'bold'}
)
ax.format(title='TeX Gyre Schola Font')rc["font.family"] = "TeX Gyre Heros"
ax = fig.subplot(233)
m = ax.heatmap(data, cmap='grays',labels=True, precision=2, labels_kw={'weight': 'bold'}
)
ax.format(title='TeX Gyre Heros Font')rc["font.family"] = "TeX Gyre Cursor"
ax = fig.subplot(234)
m = ax.heatmap(data, cmap='grays',labels=True, precision=2, labels_kw={'weight': 'bold'}
)
ax.format(title='TeX Gyre Cursor Font')rc["font.family"] = "TeX Gyre Chorus"
ax = fig.subplot(235)
m = ax.heatmap(data, cmap='grays',labels=True, precision=2, labels_kw={'weight': 'bold'}
)
ax.format(title='TeX Gyre Chorus Font')rc["font.family"] = "TeX Gyre Adventor"
ax = fig.subplot(236)
m = ax.heatmap(data, cmap='grays',labels=True, precision=2, labels_kw={'weight': 'bold'}
)
ax.format(title='TeX Gyre Adventor Font')fig.format(abc="(a)", abcloc="ul",abcsize=15,xlabel='xlabel', ylabel='ylabel',labelsize=14)fig.save(r'\第2章 绘制工具及其重要特征\图2-3-7 Proplot_fonts.png', bbox_inches='tight',dpi=600)
fig.save(r'\第2章 绘制工具及其重要特征\图2-3-7 Proplot_fonts.pdf', bbox_inches='tight')
plt.show()
ProPlot 绘图工具库为基于 Python 基础绘图工具 Matplotlib 的第三方优质拓展库,既可使用它自身的绘图函数绘制不同类型的图,也可仅使用其优质的绘图主题,即导入 ProPlot 库。
以上代码基于 ProPlot 0.9.5 版本,不包括 Matplotlib 3.4.3 的后续版本的升级优化部分。ProPlot 0.9.5 版本不支持 Matplotlib 3.5 系列版本。想要使用 ProPlot 绘制不同需求的图形结果或使用 ProPlot 优质学术风格绘图主题,可自行安装 Matplotlib 3.4 系列版本。
参考书籍:宁海涛.科研论文配图绘制指南——基于Python[M].北京:人民邮电出版社,2023:31-36.
相关文章:

ProPlot 基本语法及特点
文章目录 简介多子图绘制处理共享轴标签“跨度”轴标签多子图序号的绘制 更简单的颜色条和图例更加美观的颜色和字体 简介 科研论文配图多图层元素(字体、坐标轴、图例等)的绘制条件提出了更高要求,我们需要更改 Matplotlib 和 Seaborn 中的…...
element-template-admin get请求正常 post请求超市问题
最近搞全栈,想写个增删改查连接element-template-admin框架,postman测get和post请求都正常,到框架里直接超时,看网络请求一直是padding状态,后来经查阅资料,发现是这个template框架的问题 解决方案&#x…...

Promise.all和promise.race的应用场景举例
Promise.all( ).then( )适用于处理多个异步任务,且所有的异步任务都得到结果时的情况。 <template><div class"box"><el-button type"primary" plain click"clickFn">点开弹出框</el-button></div> &…...

go学习-指针 标识符
指针,以及标识符 1.指针 (1).基本介绍 1)基本数据类型,变量存的值,也叫值类型 2)获取变量的地址用&,比如 var num int ,获取num的地址:&num 3)指针类型&…...

LeetCode--HOT100题(42)
目录 题目描述:108. 将有序数组转换为二叉搜索树(简单)题目接口解题思路代码 PS: 题目描述:108. 将有序数组转换为二叉搜索树(简单) 给你一个整数数组 nums ,其中元素已经按 升序 排列…...

YOLOv8教程系列:三、K折交叉验证——让你的每一份标注数据都物尽其用(yolov8目标检测+k折交叉验证法)
YOLOv8教程系列:三、K折交叉验证——让你的每一份标注数据都物尽其用(yolov8目标检测k折交叉验证法) 0.引言 k折交叉验证(K-Fold Cross-Validation)是一种在机器学习中常用的模型评估技术,用于估计模型的性…...
leetcode算法题--表示数值的字符串
原题链接:https://leetcode.cn/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/description/?envTypestudy-plan-v2&envIdcoding-interviews 题目类型有点新颖,有限状态机 // CharType表示当前字符的类型 // State表示当前所处的状态 type State…...

Docker安装及Docker构建简易版Hadoop生态
一、首先在VM创建一个新的虚拟机将Docker安装好 更新系统:首先打开终端,更新系统包列表。 sudo apt-get update sudo apt-get upgrade下图是更新系统包截图 安装Docker:使用以下命令在Linux上安装Docker。 sudo apt-get install -y docker.i…...

使用Burp Suite进行Web应用渗透测试
使用Burp Suite进行Web应用渗透测试是一种常见的方法,可以帮助发现Web应用程序中的安全漏洞和弱点。 步骤: 准备工作: 首先,确保已经安装了Burp Suite,并配置浏览器以使用Burp Suite作为代理。 配置代理:…...

Github的使用指南
首次创建仓库 1.官网创建仓库 打开giuhub官网,右上角点击你的头像,随后点击your repositories 点击New开始创建仓库 如下图为创建仓库的选项解释 出现如下界面就可以进行后续的git指令操作了 2.git上传项目 进入需上传项目的所在目录,打开…...

mongodb 添加加点 stateStr 停在 STARTUP
解决办法 PRIMARY 节点是的host 是否是内网IP,如果是内网IP 需要切换成外网IP 即可;...

c语言中编译过程与预处理
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、c语言的编译与链接1、编译与链接概述2、编译与链接详解 二、c语言预处理1.c语言中内置的预定义符号2、#define定义标识符3、#define定义宏4、#define 替换规…...

TP-LINK 路由器设置内网穿透
TP-LINK 路由器设置内网穿透 开发中经常遇到调用第三方软件回调调试的情况,例如微信开发,支付回调等测试,用内网穿透是一种简单的方式也是偷懒的方式。 以TP-LINK路由器为例实现内网穿透 登录路由器 2.找到路由器虚拟服务器,添加…...

A 题国际旅游网络的大数据分析-详细解析与代码答案(2023 年全国高校数据统计与调查分析挑战赛
请你们进行数据统计与调查分析,使用附件中的数据,回答下列问题: ⚫ 问题 1: 请进行分类汇总统计,计算不同国家 1995 年至 2020 年累计旅游总人数,从哪个国家旅游出发的人数最多,哪个国家旅游到达的人数最多…...

《深入理解Java虚拟机》读书笔记: 类加载器
类加载器 虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。 类加载器可以说是Java语言的一项创新&…...

宝塔计划任务读取文件失败
想挂计划任务 相关文章【已解决】计划任务读取文件失败 - Linux面板 - 宝塔面板论坛 对方反馈的是执行下面的命令 chattr -ai /var/spool/cron 后来发现直接没有这个文件夹,然后通过mkdir命令创建文件夹,成功在宝塔创建了计划任务 后面发现任务虽然添…...
Python操作sql,备份数据库
1、批量执行sql import pymysql# 执行批量的 SQL 语句 def executeBatchSql(cursor, sqlStatements):for sql in sqlStatements:try:cursor.execute(sql)print(Executed SQL statement:, sql)except Exception as e:print(Error executing SQL statement:, e)# 创建数据库连接…...

Linux线程 --- 生产者消费者模型(C语言)
在学习完线程相关的概念之后,本节来认识一下Linux多线程相关的一个重要模型----“ 生产者消费者模型” 本文参考: Linux多线程生产者与消费者_红娃子的博客-CSDN博客 Linux多线程——生产者消费者模型_linux多线程生产者与消费者_两片空白的博客-CSDN博客…...

Vue2向Vue3过度核心技术computed计算属性
目录 1 computed计算属性1.1 概念1.2 语法1.3 注意1.4.案例1.5.代码准备 2 computed计算属性 VS methods方法2.1 computed计算属性2.2 methods计算属性2.3 计算属性的优势2.4 总结 3 计算属性的完整写法 1 computed计算属性 1.1 概念 基于现有的数据,计算出来的新属…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...