R 如何对齐峰值标签?
我试图用R中的峰值来绘制数据图。图形本身进展良好,但我遇到了标记相关峰值的问题。我目前的标签系统(详见下文)将峰值标签奇怪地移向一侧,导致线条相互交叉。有没有一种方法可以将标签与山峰本身对齐,或者从美学角度组织它们 下面的代码复制了我的问题,使用R 如何对齐峰值标签?,r,ggplot2,R,Ggplot2,我试图用R中的峰值来绘制数据图。图形本身进展良好,但我遇到了标记相关峰值的问题。我目前的标签系统(详见下文)将峰值标签奇怪地移向一侧,导致线条相互交叉。有没有一种方法可以将标签与山峰本身对齐,或者从美学角度组织它们 下面的代码复制了我的问题,使用 hjust=0.5应该工作得更好。使用hjust=0将标签稍微向右对齐,文本的上边缘与每个峰值的中间对齐 这里有一个可复制的示例,它不依赖于可能在该链接上不可用的外部数据。(有关OP数据集的应用程序,请参见底部。) 如果不构建辅助数据集,我无法找到这样
hjust=0.5
应该工作得更好。使用hjust=0
将标签稍微向右对齐,文本的上边缘与每个峰值的中间对齐
这里有一个可复制的示例,它不依赖于可能在该链接上不可用的外部数据。(有关OP数据集的应用程序,请参见底部。)
如果不构建辅助数据集,我无法找到这样做的方法。但是,一旦构建了实际绘图,那么就变得相当容易: 代码如下:
library(dplyr)
library(ggplot2)
library(ggpmisc)
library(ggrepel)
library(pracma)
#####################################
# Constants
#####################################
wvfilter = c(1975, 2275)
data_filename = "data.csv"
#####################################
# Read data
#####################################
dat = read.csv(data_filename)
colnames(dat)=c("wv", "abs")
#####################################
# Identify peaks
#####################################
# Extract peaks
peaks = data.frame(findpeaks(dat$abs, threshold=0, minpeakheight=0.03))
# Give data frame reasonable names
colnames(peaks) = c("height", "x_index", "peak_begin_index", "peak_end_index")
# Convert from index to wavelength
peaks$wv = dat$wv[peaks$x_index]
# Set the y position of the labels
peaks$nudge = 0.3-peaks$height
# Filter by wavelength
peaks = peaks %>% filter(wvfilter[1] <= wv & wv <= wvfilter[2])
#####################################
# Plot data
#####################################
ggplot(x, aes(x=wv, y=abs)) +
geom_line() +
geom_text_repel(
data=peaks,
mapping=aes(x=wv, y=height, label=height),
force=0,
nudge_y=peaks$nudge,
direction="x",
angle=90,
segment.color="red"
) +
xlab(bquote('Wavenumbers ('~cm^-1*')')) +
ylab("Absorbance (A.U.)") +
scale_x_reverse(limits=rev(wvfilter), expand=c(0,0)) +
ylim(-0.01,0.29) +
ggtitle("FTIR - Carbon Monoxide, Fundamentals")
库(dplyr)
图书馆(GG2)
图书馆(ggpmisc)
图书馆(ggrepel)
图书馆(pracma)
#####################################
#常数
#####################################
wvfilter=c(1975,2275)
data\u filename=“data.csv”
#####################################
#读取数据
#####################################
dat=read.csv(数据文件名)
colnames(dat)=c(“wv”、“abs”)
#####################################
#识别峰值
#####################################
#提取峰
峰值=数据帧(FindPeak(数据$abs,阈值=0,最小峰值=0.03))
#为数据帧提供合理的名称
colnames(peaks)=c(“高度”、“x指数”、“峰值开始指数”、“峰值结束指数”)
#从索引转换为波长
峰值$wv=dat$wv[峰值$x_指数]
#设置标签的y位置
峰值$微移=0.3-峰值$高度
#按波长过滤
peaks=peaks%>%过滤器(wvfilter[1]这是一种使用ggplot2::stage
和内置段
和文本
几何图形的方法:
library(ggplot2)
library(ggpmisc)
id <- "1S345TaPqANriDPLN6H_PyunuM1QHi485"
x <- read.csv(sprintf("https://docs.google.com/uc?id=%s&export=download", id))
colnames(x)=c("wv", "abs")
ggplot(x, aes(x=wv, y=abs)) + geom_line() +
xlab(bquote('Wavenumbers ('~cm^-1*')')) + ylab("Absorbance (A.U.)") + ggtitle("FTIR - Carbon Monoxide, Fundamentals") + ylim(-0.01,0.29) +
stat_peaks(mapping = aes(x = stage(wv, after_scale = x + 0.25)),
geom ="text", colour = "black", span = 11, angle = 90,
ignore_threshold = 0.09, size = 2.5, x.label.fmt = "%.2f",
vjust = 0.5, hjust = -1) +
stat_peaks(mapping = aes(xend = stage(wv, after_scale = x + 0.25),
y = stage(abs, after_stat = y + 0.005),
yend = after_stat(y + 0.02)),
geom ="segment", lwd = 0.5, colour = "red",
span = 11, ignore_threshold = 0.09) +
scale_x_reverse(expand=c(0,0), limits = c(2275,1975))
库(ggplot2)
图书馆(ggpmisc)
id您可以使用stat\u label\u peaks
,看看这里有没有办法避免数据被切割到标签上?这个答案只是关于问题作者的数据。同意,这里的平均峰间距似乎是这项工作的关键。我仍然希望任何可能的澄清,如果有办法避免标签与标签重叠e峰值本身。box.padding=0.0,nudge_y=0.02,
是为原始数据添加的良好参数。请参阅更新的答案。谢谢!当我复制粘贴代码时,我必须编辑出每个中的+0.25
项,以获得图形中漂亮的垂直线。你知道为什么会这样吗?我把它们放在那里是为了展示你在问题中如何画出非垂直线。如果您想要完全垂直的线条,只需将其移除即可。
library(readr)
x <- read_csv("~/Downloads/CO-FTIR Spectrum-1800 mTorr-2021.csv")
colnames(x)=c("wv", "abs")
box.padding = 0.0, nudge_y = 0.02,
library(dplyr)
library(ggplot2)
library(ggpmisc)
library(ggrepel)
library(pracma)
#####################################
# Constants
#####################################
wvfilter = c(1975, 2275)
data_filename = "data.csv"
#####################################
# Read data
#####################################
dat = read.csv(data_filename)
colnames(dat)=c("wv", "abs")
#####################################
# Identify peaks
#####################################
# Extract peaks
peaks = data.frame(findpeaks(dat$abs, threshold=0, minpeakheight=0.03))
# Give data frame reasonable names
colnames(peaks) = c("height", "x_index", "peak_begin_index", "peak_end_index")
# Convert from index to wavelength
peaks$wv = dat$wv[peaks$x_index]
# Set the y position of the labels
peaks$nudge = 0.3-peaks$height
# Filter by wavelength
peaks = peaks %>% filter(wvfilter[1] <= wv & wv <= wvfilter[2])
#####################################
# Plot data
#####################################
ggplot(x, aes(x=wv, y=abs)) +
geom_line() +
geom_text_repel(
data=peaks,
mapping=aes(x=wv, y=height, label=height),
force=0,
nudge_y=peaks$nudge,
direction="x",
angle=90,
segment.color="red"
) +
xlab(bquote('Wavenumbers ('~cm^-1*')')) +
ylab("Absorbance (A.U.)") +
scale_x_reverse(limits=rev(wvfilter), expand=c(0,0)) +
ylim(-0.01,0.29) +
ggtitle("FTIR - Carbon Monoxide, Fundamentals")
library(ggplot2)
library(ggpmisc)
id <- "1S345TaPqANriDPLN6H_PyunuM1QHi485"
x <- read.csv(sprintf("https://docs.google.com/uc?id=%s&export=download", id))
colnames(x)=c("wv", "abs")
ggplot(x, aes(x=wv, y=abs)) + geom_line() +
xlab(bquote('Wavenumbers ('~cm^-1*')')) + ylab("Absorbance (A.U.)") + ggtitle("FTIR - Carbon Monoxide, Fundamentals") + ylim(-0.01,0.29) +
stat_peaks(mapping = aes(x = stage(wv, after_scale = x + 0.25)),
geom ="text", colour = "black", span = 11, angle = 90,
ignore_threshold = 0.09, size = 2.5, x.label.fmt = "%.2f",
vjust = 0.5, hjust = -1) +
stat_peaks(mapping = aes(xend = stage(wv, after_scale = x + 0.25),
y = stage(abs, after_stat = y + 0.005),
yend = after_stat(y + 0.02)),
geom ="segment", lwd = 0.5, colour = "red",
span = 11, ignore_threshold = 0.09) +
scale_x_reverse(expand=c(0,0), limits = c(2275,1975))