R 如何对齐峰值标签?

R 如何对齐峰值标签?,r,ggplot2,R,Ggplot2,我试图用R中的峰值来绘制数据图。图形本身进展良好,但我遇到了标记相关峰值的问题。我目前的标签系统(详见下文)将峰值标签奇怪地移向一侧,导致线条相互交叉。有没有一种方法可以将标签与山峰本身对齐,或者从美学角度组织它们 下面的代码复制了我的问题,使用 hjust=0.5应该工作得更好。使用hjust=0将标签稍微向右对齐,文本的上边缘与每个峰值的中间对齐 这里有一个可复制的示例,它不依赖于可能在该链接上不可用的外部数据。(有关OP数据集的应用程序,请参见底部。) 如果不构建辅助数据集,我无法找到这样

我试图用R中的峰值来绘制数据图。图形本身进展良好,但我遇到了标记相关峰值的问题。我目前的标签系统(详见下文)将峰值标签奇怪地移向一侧,导致线条相互交叉。有没有一种方法可以将标签与山峰本身对齐,或者从美学角度组织它们

下面的代码复制了我的问题,使用


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))