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

R折线图(自备)

目录

折线图基础

创建散点和折线图

复杂折现加图例

折线图+柱状图

数据处理

进行差异检验

基础绘图折线

基础绘图箱线

进行合并

双轴柱状与折线图

数据


折线图基础
创建散点和折线图
rm(list = ls()) 
opar <-par(no.readonly=TRUE)##自带orange数据集
par(mfrow=c(1,2))#拼图
t1 <-subset(Orange,Tree==1)##提取使用数据集
head(t1)
head(t1)Tree  age circumference
1    1  118            30
2    1  484            58
3    1  664            87
4    1 1004           115
5    1 1231           120
6    1 1372           142
##散点图
p1 <- plot(t1$age,t1$circumference,xlab="Age(days)",ylab="Circumference(mm)",main="Orange Tree 1 Growth")#标题
p1
##折线图
p2 <-plot(t1$age,t1$circumference,xlab="Age(days)",ylab="Circumference(mm)",main="Orange Tree 1 Growth",type = "b")#标题
p2

折线图绘制参数:plot(x,y,type=)         lines(x,y,type=)


复杂折现加图例
#使用ggplot 绘制折线图#
data <- Orangehead(Orange)
Tree  age circumference
1    2  118            30
2    2  484            58
3    2  664            87
4    2 1004           115
5    2 1231           120
6    2 1372           142
p <- ggplot(data = Orange, aes(x=age, y=circumference, linetype=Tree, color=Tree)) +geom_point() + geom_line(lwd = 1) + scale_color_brewer(palette = "Set1") + ##颜色配色https://zhuanlan.zhihu.com/p/657907907labs(title = "Orange Tree Growth", x = "Age(days)", y = "Circumference(mm)") + theme_bw() +theme(legend.position = c(0.2,0.8)) ##"right" 图例位置p


折线图+柱状图

感谢R语言ggplot2 | 学习Nature文章精美配图 | 折线图 | 柱状图 | 误差棒 | 灰色背景 | 图片叠加 - 知乎 (zhihu.com)

数据:https://static-content.springer.com/esm/art%3A10.1038%2Fs41586-021-04194-8/MediaObjects/41586_2021_4194_MOESM11_ESM.xlsx

接受不同处理的HFD喂养小鼠的体重变化:非SMK(n = 37),SMK(n = 38),非SMK + abx(n = 40)和SMK + abx(n = 39)。从四个独立的重复序列中汇总的结果。最后一天,进行单因素方差分析(ANOVA)和Sidak校正;插图显示了烟雾暴露(暴露)或停止烟雾暴露(停止)会话、单因素方差分析和 Sidak 校正时的曲线下面积 (iAUC) 权重变化增量。

下载数据进行处理:R语言长款数据转换(自备)_r语言宽数据变成长数据-CSDN博客

数据处理

rm(list = ls()) 
library(tidyverse) 
library(reshape2)
data <- read.csv('Nature data.CSV',header = T)
head(data) 
##折线图转换为长数据:[1] "treat"  "Day"    "value1" "value2" "value3"
#根据"treat"分组  "Day"(也是X轴内容)转换为长数据,将value合并为1列
data1 <- data[,c(1:5)] %>% melt(id=c('treat','Day'))##折线误差棒errorbar上下误差位置
topbar <- function(x){      return(mean(x)+sd(x)/sqrt(length(x))) #误差采用了mean+-sem
}
bottombar <- function(x){return(mean(x)-sd(x)/sqrt(length(x)))
}
head(data1)treat Day variable value
1 Non_SMK   0   value1   0.0
2 Non_SMK   7   value1   6.7
3 Non_SMK  14   value1  14.0
4 Non_SMK  21   value1  15.6
5 Non_SMK  28   value1  24.0
6 Non_SMK  35   value1  30.0
进行差异检验

连续性变量的组间差异分析_连续变量和连续变量差异性分析-CSDN博客

##检验测试##
tdat <- data[,c(1:5)]
tdat$mean <- rowMeans(select(tdat,c(3:5)))##计算第3-5行的均值,可以用于计算相关性
#单因素方差分析#
race.aov <-aov(mean ~treat,data = tdat)
summary(race.aov)
#Df Sum Sq Mean Sq F value Pr(>F)
#treat        3  751.2   250.4    2.09  0.134
#Residuals   20 2396.6   119.8   ##两组间最后一组数据t检验## 
group1 <- tdat[tdat$treat =="Non_SMK+abx"& tdat$Day=="35",c(3:5)]
group2 <- tdat[tdat$treat =="SMK+abx" & tdat$Day=="35",c(3:5)]
t.test(group1,group2,var.equal =TRUE)
#t = 12.267, df = 4, p-value = 0.0002536  ****group3 <- tdat[tdat$treat =="SMK"& tdat$Day=="35",c(3:5)]
t.test(group2,group3,var.equal =TRUE)#一样的
#t = -7.4158, df = 4, p-value = 0.001765 ***
基础绘图折线
#绘图赋值为p
p0 <- ggplot(data1,aes(x=Day,y=value,color=treat))+#Day为X,value值为Y,分组颜色treatgeom_rect(aes(xmin=21,xmax=40,ymin=(-Inf),ymax=Inf),##后半部分色块设置fill='grey90',color='grey90')+geom_vline(xintercept =21,linetype=2,cex=1.2)+            #添加虚线stat_summary(geom = 'line',fun='mean',cex=2.5)+           #折线stat_summary(geom = 'errorbar',                           #误差磅fun.min = bottombar,fun.max = topbar,width=1,cex=0.8,aes(color=treat))+stat_summary(geom = 'point',fun='mean',aes(fill=treat),   #点size=5,pch=21,color='black')+theme_classic(base_size = 15)+theme(legend.position = 'none')#top
p0

##点的颜色修改以及显著性标记的添加##
p1 <- p0+scale_color_manual(values = c('#5494cc','#0d898a','#e18283','#f9cc52'))+##线条的颜色scale_fill_manual(values = c('red','#0d898a','#e18283','white'))+ ##点的颜色scale_y_continuous(breaks = seq(0,60,20),expand = c(0,0))+              #Y轴范围scale_x_continuous(breaks = seq(0,40,10),expand = c(0,0))+              #X轴范围labs(y='Weight change(%)')+theme(axis.line = element_line(size = 1),                               #线条设置axis.text = element_text(color = 'black'),axis.ticks = element_line(size = 1,color='black'))+annotate(geom = 'segment',x=36.2,xend=36.2,y=18,yend=26,cex=1.2)+       ##显著性标注设置-线段annotate(geom = 'text',label='***',x=37.5,y=22,size=7,angle=90)+        ##显著性标注设置-数值或***annotate(geom = 'segment',x=38,xend = 38,y=18,yend = 40,cex=1.2)+annotate(geom = 'text',label='****',x=39.5,y=29,size=7,angle=90)
p1##折线图图列的添加并且修改了图例形状##
linechart <- p1+coord_cartesian(clip = 'off',ylim = c(0,60),xlim = c(0,40))+theme(plot.margin = margin(1.5,0.5,0.5,0.5,'cm'))+geom_rect(aes(xmin=0,xmax=3,ymin=63,ymax=65),fill='#5494cc',color='black')+geom_rect(aes(xmin=10,xmax=13,ymin=63,ymax=65),fill='#0d898a',color='black')+geom_rect(aes(xmin=20,xmax=23,ymin=63,ymax=65),fill='#e18283',color='black')+geom_rect(aes(xmin=30,xmax=33,ymin=63,ymax=65),fill='#f9cc52',color='black')+annotate('text',x=6,y=64,label='Non-SMK',size=4)+annotate('text',x=15.2,y=64,label='SMK',size=4)+annotate('text',x=26.4,y=64,label='Non-SMK+\nabx',size=4)+annotate('text',x=36,y=64,label='SMK+abx',size=4)
linechart


基础绘图箱线
##提取箱线图数据
data2 <- data[,6:9] %>% gather(key = treat)
head(data2)
data3 <- data[,10:13] %>% gather(key = treat)#左边柱状图:
leftchart <- ggplot(data2,aes(factor(treat,levels = c('SMK.abx','Non_SMK.abx','SMK','Non_SMK')),value))+stat_summary(geom = 'bar',fun = 'mean',fill='white',color='black',width=0.7,cex=1)+stat_summary(geom = 'errorbar',fun.min = bottombar,fun.max = topbar,width=0.3,cex=0.8,color='black')+geom_jitter(aes(color=factor(treat,levels = c('SMK.abx','Non_SMK.abx','SMK','Non_SMK'))),width = 0.1,size=1.5)+scale_color_manual(values = c('#f9cc52','#0d898a','#e18283','#5494cc'))+labs(x=NULL,y=NULL)+scale_y_continuous(limits = c(-40,600),expand = c(0,0))+geom_hline(yintercept =0,cex=1)+theme_classic(base_size = 15)+theme(axis.ticks.y = element_blank(),axis.text.y= element_blank(),legend.position = 'none',axis.line = element_line(size = 1),axis.text = element_text(color = 'black'),axis.ticks = element_line(size = 1,color='black'))+coord_flip()+annotate(geom = 'segment',x=1,xend=2,y=530,yend=530,cex=1.2)+annotate(geom = 'text',label='****',x=1.5,y=570,size=6,angle=90)+annotate(geom = 'segment',x=3,xend =4,y=370,yend =370,cex=1.2)+annotate(geom = 'text',label='****',x=3.5,y=410,size=6,angle=90))
leftchart#右边柱状图:
rightchart <- ggplot(data3,aes(factor(treat,levels = c('SMK.abx.1','Non_SMK.abx.1','SMK.1','Non_SMK.1')),value))+stat_summary(geom = 'bar',fun = 'mean',fill='white',color='black',width=0.7,cex=1)+stat_summary(geom = 'errorbar',fun.min = bottombar,fun.max = topbar,width=0.3,cex=0.8,color='black')+geom_jitter(aes(color=factor(treat,levels = c('SMK.abx.1','Non_SMK.abx.1','SMK.1','Non_SMK.1'))),width = 0.1,size=1.5)+scale_color_manual(values = c('#f9cc52','#0d898a','#e18283','#5494cc'))+labs(x=NULL,y=NULL)+scale_y_continuous(limits = c(-40,500),expand = c(0,0))+geom_hline(yintercept =0,cex=1)+theme_classic(base_size = 15)+theme(axis.ticks.y = element_blank(),axis.text.y= element_blank(),legend.position = 'none',axis.line = element_line(size = 1),axis.text = element_text(color = 'black'),axis.ticks = element_line(size = 1,color='black'),plot.background = element_rect(fill = "transparent",colour = NA),panel.background = element_rect(fill = "transparent",colour = NA))+coord_flip()+annotate(geom = 'segment',x=1,xend=2,y=420,yend=420,cex=1.2)+annotate(geom = 'text',label='****',x=1.5,y=460,size=6,angle=90)+annotate(geom = 'segment',x=3,xend =4,y=430,yend =430,cex=1.2)+annotate(geom = 'text',label='****',x=3.5,y=470,size=6,angle=90)
rightchart


进行合并
#要叠加的图片先用ggplotGrob()函数处理:
leftchart <- ggplotGrob(leftchart)
rightchart <- ggplotGrob(rightchart)#叠加绘图:
linechart+annotation_custom(leftchart,xmin=0,xmax=20.5,ymin=40,ymax=57)+annotation_custom(rightchart,xmin=21,xmax=39.5,ymin=40,ymax=57)+annotate('text',label='iAUC: Exposure',x=10.5,y=58.5,size=7)+annotate('text',label='iAUC: Cessation',x=31,y=58.5,size=7)

感谢:“R语言ggplot2科研绘图”的代码,本文主要是复现流程和差异计算补充!!


双轴柱状与折线图

Nature图表复现|双轴柱状与折线图 (qq.com)

数据

rm(list = ls()) 
library(tidyverse)
library(gapminder)
library(Hmisc)
library(gapminder)data <- gapminder
##提取continent=="Asia"的数据
df <- data %>% filter(continent=="Asia") %>% select(1,3,4,6) %>% mutate(year=as.character(year))p <- ggplot() +stat_summary(data=df, aes(year, lifeExp), fun = "mean", geom = "bar", alpha = 0.7, fill="#00A08A") +# 添加预期寿命(lifeExp)的误差条stat_summary(data=df, aes(year, lifeExp), fun.data = "mean_cl_normal", geom = "errorbar", width = .2, color="#00A08A") +# 添加人均GDP(gdpPercap)的误差条stat_summary(data=df %>% mutate(gdpPercap=gdpPercap/20), aes(year, gdpPercap), fun = mean, geom = "errorbar", width=.2, color="#F98400",fun.max = function(x) mean(x) + sd(x) / sqrt(length(x)),fun.min = function(x) mean(x) - sd(x) / sqrt(length(x))) +# 添加人均GDP(gdpPercap)的平均值点stat_summary(data=df %>% mutate(gdpPercap=gdpPercap/20), aes(year, gdpPercap), fun = "mean", geom = "point", size=3, color="#F98400") +# 添加人均GDP(gdpPercap)的平均值线stat_summary(data=df %>% mutate(gdpPercap=gdpPercap/20), aes(year, gdpPercap, group=1), fun = "mean", geom = "line", color="#F98400") +# 设置y轴的比例和标签scale_y_continuous(expand = c(0, 1), breaks = scales::pretty_breaks(n = 12),sec.axis = sec_axis(~. * 20, breaks = scales::pretty_breaks(n = 12),name = "gdpPercap")) +# 应用主题theme_test() +# 自定义主题设置theme(panel.background = element_blank(),axis.ticks.length.x.bottom = unit(-0.05, "in"),axis.ticks.length.y.left = unit(-0.05, "in"),axis.ticks.length.y.right = unit(-0.05, "in"),axis.line.y.left = element_line(color="#00A08A"),axis.line.y.right = element_line(color="#F98400"),axis.line.x.bottom = element_line(color="black"),axis.line.x.top = element_line(color="grey80"),axis.text.y.right = element_text(color="#F98400", margin = margin(l = 5, r = 10)),axis.text.y.left = element_text(color="#00A08A", margin = margin(l = 10, r = 5)),axis.title.y.left = element_text(color="#00A08A", face="bold"),axis.title.y.right = element_text(color="#F98400", face="bold"),axis.title.x.bottom = element_blank())
p
dev.off()


参考:

1:《R语言实战手册》

2:Gut microbiota modulates weight gain in mice after discontinued smoke exposure

相关文章:

R折线图(自备)

目录 折线图基础 创建散点和折线图 复杂折现加图例 折线图柱状图 数据处理 进行差异检验 基础绘图折线 基础绘图箱线 进行合并 双轴柱状与折线图 数据 折线图基础 创建散点和折线图 rm(list ls()) opar <-par(no.readonlyTRUE)##自带orange数据集 par(mfrowc…...

web学习笔记(四十五)Node.js

目录 1. Node.js 1.1 什么是Node.js 1.2 为什么要学node.js 1.3 node.js的使用场景 1.4 Node.js 环境的安装 1.5 如何查看自己安装的node.js的版本 1.6 常用终端命令 2. fs 文件系统模块 2.1引入fs核心模块 2.2 读取指定文件的内容 2.3 向文件写入指定内容 2.4 创…...

基于Gabor滤波器的指纹图像识别,Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…...

55、Qt/事件机制相关学习20240326

一、代码实现设置闹钟&#xff0c;到时间后语音提醒用户。示意图如下&#xff1a; 代码&#xff1a; #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), speecher(new QTextToSpeech(t…...

Clip Converter - 视频在线下载方法

Clip Converter - 视频在线下载方法 1. Video URL to Download2. Continue3. StartReferences YT to MP4 & MP3 Converter! https://www.clipconverter.cc/ Clip Converter is a free online media conversion application, which allows you to reocord, convert and do…...

【No.19】蓝桥杯简单数论上|模运算|快速幂|GCD|LCM|刷题统计|RSA解密|核桃的数量(C++)

简单数论 模运算 定义&#xff1a;模运算为 a 除以 m 的余数&#xff0c;记为 a mod m&#xff0c;有 a mod m a % m模运算是大数运算中的常用操作。如果一个数太大&#xff0c;无法直接输出&#xff0c;或者不需要直接输出&#xff0c;可以把它取模后&#xff0c;缩小数值再…...

区块链安全之DDoS防护的重要性及其实施策略

随着区块链技术的不断发展和广泛应用&#xff0c;其安全问题也日益凸显。其中&#xff0c;分布式拒绝服务(DDoS)攻击是对区块链网络稳定性和效率构成潜在威胁的重要因素之一。本文旨在深入探讨区块链为何需要采取DDoS高防措施&#xff0c;并提出相应的防护策略。 一、区块链面…...

使用Spark单机版环境

在Spark单机版环境中&#xff0c;可通过多种方式进行实战操作。首先&#xff0c;可使用特定算法或数学软件计算圆周率π&#xff0c;并通过SparkPi工具验证结果。其次&#xff0c;在交互式Scala版或Python版Spark Shell中&#xff0c;可以进行简单的计算、打印九九表等操作&…...

【分布式】——降级熔断限流

降级&熔断&限流 ⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记仓库&#x1f449;https://github.com/A-BigTree/tree-learning-notes 个人主页&#x1f449;https://www.abigtree.top ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点…...

代码随想录刷题笔记 Day 58 | 判断子序列 No.392 | 不同的子序列 No.115

文章目录 Day 5801. 判断子序列&#xff08;No. 392&#xff09;<1> 题目<2> 题解<3> 代码 02. 不同的子序列&#xff08;No. 115&#xff09;<1> 题目<2> 题解<3> 代码 Day 58 01. 判断子序列&#xff08;No. 392&#xff09; 题目链接…...

【C++11】thread线程库

【C11】thread线程库 目录 【C11】thread线程库thread类的简单介绍函数指针lambda表达式常用在线程中 线程函数参数join与detach利用RAII思想来自动回收线程 原子性操作库(atomic)atomic中的load函数&#xff1a;atomic中对变量进行原子操作的一些函数 CAS(Compare-And-Swap)无…...

【OpenStack】创建系统(VM)实例镜像及实例创建方法

【OpenStack】创建系统(VM)实例镜像及实例创建方法 目录 【OpenStack】创建系统(VM)实例镜像及实例创建方法创建计算镜像加载基本镜像预建镜像手动实例创建cloud-init 搭救使用 `cloud-init` 配置启动实例连接到您的新实例为实例分配 Floating IP创建SSH隧道结论推荐超级课程:…...

灵途科技助力家电智能创新

从智能家电到个护健康&#xff0c;科技无时无刻不在刷新我们对智慧生活的认知&#xff0c;我们也从未像今天这样近距离贴近智慧生活的朴素本质——传感技术。灵途科技专注光电感知技术&#xff0c;持续为智能家电客户提供成熟的全方位感知解决方案。步入发展第八年&#xff0c;…...

Flask python :logging日志功能使用

logging日志的使用 一、了解flask日志1.1、Loggers记录器1.2、Handlers 处理器1.3、Formatters 格式化器 二、使用日志2.1、官网上的一个简单的示例2.2、基本配置2.3、具体使用示例2.4、运行 三、写在最后 一、了解flask日志 日志是一种非常重要的工具&#xff0c;可以帮助开发…...

ethers.js:sign(签名)

Signers 在ethers中Signer是以太坊账户的抽象&#xff0c;可以用来签名消息和交易&#xff0c;如将签名的交易发送到以太坊网络以执行状态更改的操作。 npm install ethers5.4.0// 引入 import { ethers } from ethers签名 this.provider new ethers.providers.Web3Provider(…...

使用npm i进行admin依赖安装的时候出现问题

提示&#xff1a; npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.npm.taobao.org/string-width failed, reason: certificate has expired 切换淘宝源到http或者更换其他国内镜像 npm config set registry http:/…...

【Python笔记-FastAPI】定时任务实现(APScheduler)

目录 一、常见触发器 (一) DateTrigger (二) IntervalTrigger (三) CronTrigger (四) CombinationTrigger 二、代码示例 (一) task_scheduler.py (二) client.py 三、调用说明 (一) 注册任务 (二) 查询任务 (三) 删除任务 实现功能: 定时任务注册、修改、删除、查…...

『Apisix入门篇』从零到一掌握Apache APISIX:架构解析与实战指南

&#x1f4e3;读完这篇文章里你能收获到&#xff1a; &#x1f310; 深入Apache APISIX架构&#xff1a; 从Nginx到OpenResty&#xff0c;再到etcd&#xff0c;一站式掌握云原生API网关的构建精髓&#xff0c;领略其层次化设计的魅力。 &#x1f50c; 核心组件全解析&#xff…...

easyExcel大数据量导出oom

easyExcel大数据量导出 异常信息 com.alibaba.excel.exception.ExcelGenerateException: java.lang.OutOfMemoryError: GC overhead limit exceededat com.alibaba.excel.write.ExcelBuilderImpl.fill(ExcelBuilderImpl.java:84)at com.alibaba.excel.ExcelWriter.fill(Excel…...

react native上传二进制图片、视频的方法

react native获取本地图片我用的react-native-image-picker&#xff0c;但是它只能获取图片路径&#xff0c;以及base64的图片&#xff0c;不能获取到binary二进制形式的。 一开始我是让后端改造接口&#xff0c;把原本传binary的改成了base64&#xff0c;可是&#xff0c;躲得…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...