首页 > 解决方案 > 将文本与不同位置的 geom_vline 对齐

问题描述

我有一个函数可以创建一个带有覆盖密度图的直方图。该函数还显示一条红色虚线,指示 alpha。用户可以指示 alpha 级别。此外,直方图中的计数将作为输入数据的函数而有所不同。我想要一个标签,在红色虚线旁边指示 alpha = 0.05(例如)。标签应始终位于 alpha 线旁边,并且始终位于图表顶部附近(我没有解决这个问题)。我知道Align geom_text to a geom_vline in ggplot2,但它们没有提供我正在寻找的内容(和/或产生错误消息,我试图通过 text=element_text(size=11) 减小标签的大小正如那里所建议的那样,但这不起作用)。

在下面找到一些示例代码:

multiverse.p.histogram <- function(dataframe, pvalues, alpha = 0.05){
hist <- ggplot(dataframe, aes(x = p.value)) + geom_histogram(binwidth = 0.01, color = "black",fill = "dodgerblue") + theme_bw() + xlim(0,1) + geom_density(alpha = 0.5, fill = "#FF6666") +xlab("p-value") + ggtitle("Histogram of Multiverse P-Values") + geom_vline(xintercept = alpha, color = "red", linetype = "dashed") +
  geom_text(aes(x = alpha, y = 75, label = "Alpha"), color = "red") +
  theme(
  axis.text = element_text(color = "black"),
  axis.line = element_line(colour = "black"),
  legend.position = "none",
  panel.grid.major = element_blank(),
  panel.grid.minor = element_blank(),
  panel.border = element_blank(),
  panel.background = element_blank())
return(hist)
}#close histogram function


#and some sample data
df_multiverse <- structure(list(transformation = c("normal", "normal", "normal", 
"normal", "normal", "normal", "normal", "normal", "normal", "normal", 
"normal", "normal", "normal", "normal", "normal", "normal", "normal", 
"normal", "normal", "normal", "normal", "normal", "normal", "normal", 
"normal", "normal", "normal", "normal", "normal", "normal", "normal", 
"normal", "normal", "normal", "normal", "normal", "normal", "normal", 
"normal", "normal", "normal", "normal", "normal", "normal", "normal", 
"normal", "normal", "normal", "normal", "normal"), datatrimming = c("notrimming", 
"notrimming", "notrimming", "notrimming", "notrimming", "notrimming", 
"notrimming", "notrimming", "notrimming", "notrimming", "notrimming", 
"mad", "mad", "mad", "mad", "mad", "mad", "mad", "mad", "mad", 
"mad", "mad", "mad", "mad", "mad", "mad", "mad", "mad", "mad", 
"mad", "mad", "mad", "mad", "mad", "mad", "mad", "mad", "mad", 
"mad", "mad", "mad", "mad", "mad", "mad", "mad", "mad", "mad", 
"mad", "mad", "mad"), fixedtrimming = c("min", "min", "min", 
"min", "min", "minmax", "minmax", "minmax", "minmax", "minmax", 
"nofixedtrimming", "min", "min", "min", "min", "min", "minmax", 
"minmax", "minmax", "minmax", "minmax", "nofixedtrimming", "min", 
"min", "min", "min", "min", "minmax", "minmax", "minmax", "minmax", 
"minmax", "nofixedtrimming", "min", "min", "min", "min", "min", 
"minmax", "minmax", "minmax", "minmax", "minmax", "nofixedtrimming", 
"min", "min", "min", "min", "min", "minmax"), min = c("0.1", 
"0.2", "0.3", "0.4", "0.5", "0.1", "0.2", "0.3", "0.4", "0.5", 
NA, "0.1", "0.2", "0.3", "0.4", "0.5", "0.1", "0.2", "0.3", "0.4", 
"0.5", NA, "0.1", "0.2", "0.3", "0.4", "0.5", "0.1", "0.2", "0.3", 
"0.4", "0.5", NA, "0.1", "0.2", "0.3", "0.4", "0.5", "0.1", "0.2", 
"0.3", "0.4", "0.5", NA, "0.1", "0.2", "0.3", "0.4", "0.5", "0.1"
), max = c("4.78103879314337", "4.78103879314337", "4.78103879314337", 
"4.78103879314337", "4.78103879314337", "10", "10", "10", "10", 
"10", NA, "1.50348972125673", "1.50348972125673", "1.50348972125673", 
"1.50348972125673", "1.50348972125673", "10", "10", "10", "10", 
"10", NA, "1.6673730851492", "1.6673730851492", "1.6673730851492", 
"1.6673730851492", "1.6673730851492", "10", "10", "10", "10", 
"10", NA, "1.82875939263309", "1.82875939263309", "1.82875939263309", 
"1.82875939263309", "1.82875939263309", "10", "10", "10", "10", 
"10", NA, "1.98682907108801", "1.98682907108801", "1.98682907108801", 
"1.98682907108801", "1.98682907108801", "10"), DispersionMeasure = c(NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "2", "2", "2", "2", "2", 
"2", "2", "2", "2", "2", "2", "2.5", "2.5", "2.5", "2.5", "2.5", 
"2.5", "2.5", "2.5", "2.5", "2.5", "2.5", "3", "3", "3", "3", 
"3", "3", "3", "3", "3", "3", "3", "3.5", "3.5", "3.5", "3.5", 
"3.5", "3.5"), df = c(23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 
23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 
23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 
23, 23, 23, 23, 23, 23, 23, 23), t.value = c(-1.96240490816673, 
-1.91062435558061, -1.88913858576971, -1.50889838134833, -0.584414818091524, 
-1.96240490816673, -1.91062435558061, -1.88913858576971, -1.50889838134833, 
-0.584414818091524, -2.01035512741752, -2.32446732021548, -2.32446732021548, 
-2.25138730178018, -1.75805360848308, -0.671509667928522, -2.32446732021548, 
-2.32446732021548, -2.25138730178018, -1.75805360848308, -0.671509667928522, 
-2.32446732021548, -2.07781942947361, -2.04327207374561, -1.96398718960439, 
-1.45016152484876, -0.43329653628318, -2.07781942947361, -2.04327207374561, 
-1.96398718960439, -1.45016152484876, -0.43329653628318, -2.07781942947361, 
-3.1795493150037, -3.14621983607465, -3.03987566457514, -2.35519486220697, 
-1.34118074962509, -3.1795493150037, -3.14621983607465, -3.03987566457514, 
-2.35519486220697, -1.34118074962509, -3.19618807311348, -3.37575126770368, 
-3.33582114002809, -3.25737102188504, -2.65364122964845, -1.74520405186558, 
-3.37575126770368), p.value = c(0.0619242560601778, 0.0685974542038329, 
0.0715464534237802, 0.14494031195569, 0.564630276572904, 0.0619242560601778, 
0.0685974542038329, 0.0715464534237802, 0.14494031195569, 0.564630276572904, 
0.056262190757649, 0.0292871811194525, 0.0292871811194525, 0.0342153500184824, 
0.0920408256371383, 0.508584931329577, 0.0292871811194525, 0.0292871811194525, 
0.0342153500184824, 0.0920408256371383, 0.508584931329577, 0.0292871811194525, 
0.049074641173751, 0.0526459198825374, 0.0617296734199745, 0.160514579425126, 
0.668835951230964, 0.049074641173751, 0.0526459198825374, 0.0617296734199745, 
0.160514579425126, 0.668835951230964, 0.049074641173751, 0.00417775230313281, 
0.00452298394363368, 0.00581820793330847, 0.0274164539383892, 
0.192956766873482, 0.00417775230313281, 0.00452298394363368, 
0.00581820793330847, 0.0274164539383892, 0.192956766873482, 0.00401507276581307, 
0.00260719926285416, 0.00287129534969705, 0.00346795018735445, 
0.0141919615636613, 0.0942977424474807, 0.00260719926285416), 
    estimate = c(-0.797956867083461, -0.776801900236937, -0.7455698051489, 
    -0.444049984838546, -0.10530217843728, -0.797956867083461, 
    -0.776801900236937, -0.7455698051489, -0.444049984838546, 
    -0.10530217843728, -0.820469748450972, -0.251308805770323, 
    -0.251308805770323, -0.251096848307402, -0.226028966303428, 
    -0.134612249858047, -0.251308805770323, -0.251308805770323, 
    -0.251096848307402, -0.226028966303428, -0.134612249858047, 
    -0.251308805770323, -0.265907227757688, -0.261504591915461, 
    -0.260164781545852, -0.225524157517464, -0.10176195202019, 
    -0.265907227757688, -0.261504591915461, -0.260164781545852, 
    -0.225524157517464, -0.10176195202019, -0.265907227757688, 
    -0.409969137221152, -0.405618224033153, -0.409494543344045, 
    -0.387356945276789, -0.329354185640372, -0.409969137221152, 
    -0.405618224033153, -0.409494543344045, -0.387356945276789, 
    -0.329354185640372, -0.422572659021681, -0.506062313897924, 
    -0.501186805248218, -0.510763602114717, -0.498830153358464, 
    -0.447892133899374, -0.506062313897924)), row.names = c("df", 
"df1", "df2", "df3", "df4", "df5", "df6", "df7", "df8", "df9", 
"df10", "df11", "df12", "df13", "df14", "df15", "df16", "df17", 
"df18", "df19", "df20", "df21", "df22", "df23", "df24", "df25", 
"df26", "df27", "df28", "df29", "df30", "df31", "df32", "df33", 
"df34", "df35", "df36", "df37", "df38", "df39", "df40", "df41", 
"df42", "df43", "df44", "df45", "df46", "df47", "df48", "df49"
), class = "data.frame")

#execute function
multiverse.p.histogram(df_multiverse, df_multiverse$p.value)

代码有两个问题: alpha 不在行旁边显示,但在行上,我必须手动指定 y = 75。理想情况下,它应该总是在上边界的下方。最后,我无法减小 alpha 的文本大小。我尝试了 nudge_x,但这会产生以下错误:Warnmeldungen:1:删除了包含缺失值的 2 行(geom_bar)。2:删除了包含缺失值的 264 行 (geom_text)。

有人有建议吗?已经谢谢了!

编辑:

根据答案,这是我更新的代码:

multiverse.p.histogram <- function(dataframe, pvalues, alpha = 0.05){
  
  ggplot(dataframe, aes(x = p.value)) + 
    geom_histogram(binwidth = 0.01, color = "black", fill = "dodgerblue") + #plots the histogram
    geom_density(alpha = 0.5, fill = "#FF6666") + #adds densityplot
    geom_vline(xintercept = alpha, color = "red", linetype = "dashed") + #adds alpha line
    geom_text(x = alpha, hjust = -0.5, #adds alpha symbol next to line
              y = Inf,
              label = expression(paste(alpha)), 
              color = "red", check_overlap = TRUE,
              vjust = "inward") +
    ggtitle("Histogram of Multiverse P-Values") +
    xlab("p-value") + 
    theme_bw() + 
    theme(axis.text = element_text(color = "black"),
          axis.line = element_line(colour = "black"),
          legend.position = "none",
          panel.grid.major = element_blank(),
          panel.grid.minor = element_blank(),
          panel.border = element_blank(),
          panel.background = element_blank())
}

标签: rggplot2

解决方案


以下是对您的功能的一些调整,可能会有所帮助:

  1. hist使用基本 R函数找出绘图的近似上限在哪里。将此用作 的位置alpha,然后将 y 上限设置为该位置的小倍数,以确保一切都很好。
  2. 您只需要一个alpha标签,因此不要将文本映射到美学。您可以直接使用 x 和 y 位置。
  3. 用于hjust调整文本位置。
  4. 如果您安排绘图代码,它会使您的代码更易于阅读和调试,因此它可以整齐地放在一个屏幕上并且是可预测的顺序(我喜欢 ggplot 然后 geoms 然后缩放然后 lims ,然后是标签然后是主题,但无论顺序如何最适合您,坚持一致的方案。
multiverse.p.histogram <- function(dataframe, pvalues, alpha = 0.05)
{
  upper <- max(hist(dataframe$p.value, breaks = seq(0, 1, 0.01))$counts)
  ggplot(dataframe, aes(x = p.value)) + 
    geom_histogram(binwidth = 0.01, color = "black", fill = "dodgerblue") + 
    geom_density(alpha = 0.5, fill = "#FF6666") +
    geom_vline(xintercept = alpha, color = "red", linetype = "dashed") +
    geom_text(x = alpha, hjust = -0.25,
              y = upper,
              label = "Alpha", 
              color = "red", check_overlap = TRUE) +
    coord_cartesian(xlim = c(0, 1)) +
    xlim(-0.01, 1) +
    ylim(0, upper * 1.1) +
    ggtitle("Histogram of Multiverse P-Values") +
    xlab("p-value") + 
    theme_bw() + 
    theme(axis.text = element_text(color = "black"),
          axis.line = element_line(colour = "black"),
          legend.position = "none",
          panel.grid.major = element_blank(),
          panel.grid.minor = element_blank(),
          panel.border = element_blank(),
          panel.background = element_blank())
}

在此处输入图像描述


推荐阅读