微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何保持 ggplot2 注释在绘图上对齐并处于固定位置?

如何解决如何保持 ggplot2 注释在绘图上对齐并处于固定位置?

我正在绘制 2 个密度,并尝试添加一些在文本旋转 90 度时水平对齐的注释,但当注释的字符长度不同时,我似乎无法让它们对齐。

library(ggplot2)

n <- 10000 
mu_a <- .089
mu_b <- .099
s_a <- .0092
s_b <- .004

df <- data.frame(
  variant = factor(c(rep("A",n),rep("B",n))),p = c(rnorm(n = n,mean = mu_a,sd = s_a),rnorm(n = n,mean = mu_b,sd = s_b)))


ggplot(df,aes(x = p,fill = variant)) +
  geom_density() +
  scale_x_continuous(labels = scales::percent) +
  scale_y_continuous(expand = expansion(mult = c(0,.1))) +
  annotate("text",x = c(mu_a,mu_b),y = Inf,vjust = "center",hjust = 6,label = c("5char","06char"),angle = 90
     )

reprex package (v0.3.0) 于 2021 年 5 月 12 日创建

https://i.imgur.com/CxW1pjP.png 处绘制图像

我尝试使用 scale_y_continuous(y = ..scaled..) 将 y 轴更改为 0:1 比例,然后将注释 y 值设置为固定位置,如 y = 0.2,但随后密度大小不合适。已经尝试了 hjust 和 vjust 的各种组合。我认为这些应该像情节的百分比一样工作。所以 vjust = 0.2 意味着 20% 的情节,但它对我来说不是那样的。我没想到通过将文本旋转 90 度,hjust 和 vjust 会交换,但这似乎是发生的事情。

解决方法

我不确定我是否 100% 关注,但试试这个:

ggplot(df,aes(x = p,..scaled..,fill = variant)) +
  geom_density(alpha = 0.8,adjust = 0.2) +
  scale_x_continuous(labels = scales::percent) +
  scale_y_continuous(expand = expansion(mult = c(0,.1))) +
  annotate("text",x = c(mu_a,mu_b),y = 0.5,hjust = 0.5,label = c("5char","20charxxxxxxxxxxxxxx"),angle = 90
  )

主要标注:

  • y 设置为 0.5。这是一个密度图,因此可以在映射中使用 ..scaled.. 进行缩放,以便最大 y 始终为 1(请参阅 geom_density y-axis goes above 1

  • 删除了 vjust

  • hjust 更改为 0.5。虽然接受大于 1 的值,但最简单的方法是将 0 视为左对齐,1 为右对齐,0 为中心对齐。它是 hjust 而不是 vjust 的原因是因为理由是从文本的角度 - 而不是情节的方向(这是有道理的 - 考虑角度不是 0 或 90 ).

  • 我向`geom_density() 函数中添加了一个 alpha 值,以便为两者显示完整曲线(这根本不是问题的一部分,但我无法自拔)

这应该返回以下内容:

Plot using the code above

,

我在这里找到的最佳答案是:

  1. annotation_custom() 与 grid 包和 textGrob() 函数一起使用。这确实允许按 x 和 y 轴的百分比定位注释。问题是你不能像我试图做的那样混合使用 x 指向比例尺和 y 比例尺的方法。
  2. 计算图中值范围的上限。您可以从像 ggplot_build(.)$layout$panel_scales_y[[1]]$range$range[[2]] 这样的 ggplot 对象中获取它,也可以从像 d <- density(.) 然后 d$y[which.max(d$y)] 这样的密度函数中获取它。获得范围的上限后,您可以继续使用该上限的一部分作为 y 位置来构建图。

将 y 比例设置为 ..scaled.. 确实会将 y 比例设置为最大 1,但是,在绘制多个密度时,它会将两者设置为各自的比例,而不是彼此准确地缩放。因此,宽密度和窄密度将具有相同的高度。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。