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

如何为 geom_point() 调整 scale_alpha?

如何解决如何为 geom_point() 调整 scale_alpha?

我制作了这个火山图:

enter image description here

我希望 colored geom_point() 具有递增的 alpha,例如-log(P-value) ~2.3 处的值对应于 alpha = 0.75,而 -log(P-value) 尺度上的最大值对应于 alpha = 1。这应该会使阅读浓缩区域中的文本更容易一些。

预期输出手动绘制的两个 geom_point() 示例说明了我试图完成的图形输出

enter image description here

脚本

ggplot(BT_Ctrl,aes(x = diff,y = logp)) + 
  geom_point(data = filter(BT_Ctrl,(logp > 0 & logp < (-log(0.1))) | (logp > (-log(0.1)) & diff > (-1) & diff < 0) 
  ),aes(alpha = logp),size = 3,color = "grey50",fill = "grey60",shape=21,stroke = 1) +
  
  scale_alpha_continuous(range = c(0.05,.25)) + 

  
  geom_point(data = filter(BT_Ctrl,(logp > (-log(0.1)) & diff < (-1)) | (logp > (-log(0.1)) & diff > 0)) %>%
               mutate(group = ifelse(diff > 0,"Tumor","Ctrl")),aes(color = group,fill = group,size = logp,alpha = logp),alpha = .25,shape = 21,stroke = 1.5) +
  
  
  scale_size(range = c(3.5,8.5)) +
  
  scale_fill_manual(values = alpha(c("#D1B551","#678F53"),0.2),name = "",labels = c("Low abundant","High abundant")) +
  scale_colour_manual(values = c("#D1B551","High abundant")) +
  
  scale_x_continuous(breaks = seq(-3,4,1),name = "**Difference on log<sub>2</sub>-scale**") +
  scale_y_continuous(breaks = seq(0,8,name = "**-log**(*P*-value)") +
  coord_cartesian(ylim = c(0,8),xlim = c(-3.5,4)) +
  
  guides(colour = guide_legend(override.aes = list(size = 10)),size = "none",alpha = "none") +
  
  theme(axis.line = element_line(colour = "black",size = .6),panel.grid.major = element_line(colour = "gray95"),panel.grid.minor = element_line(colour = "gray95"),panel.border = element_blank(),panel.background = element_blank(),axis.text.x = element_text(color = "grey20",size = 16),axis.title.x = ggtext::element_markdown(color = "grey20",size = 22,margin = ggplot2::margin(t = 10)),axis.text.y = element_text(color = "grey20",axis.title.y = ggtext::element_markdown(color = "grey20",size = 25,margin = ggplot2::margin(r = 8)),legend.key = element_rect(fill = "white"),plot.title = ggtext::element_markdown(color = "grey20",size = 20,hjust = 0),plot.subtitle = element_text(hjust = 0.5),legend.text = ggtext::element_markdown(size = 30),legend.title = element_text(size = 20,hjust = 0.5),legend.position = "bottom")

尝试

我尝试添加aes(alpha=logp),例如:

  geom_point(data = filter(BT_Ctrl,stroke = 1.5) +

哪种方式做到了:

enter image description here

但是,我不知道手动调整/编辑以使高 -log(P-values) 变得更加可见/不那么透明。

我尝试了不同版本的 scale_alpha_continuous(range = c(0.75,1)) +,这弄乱了 fill

enter image description here

数据

BT_Ctrl <- structure(list(diff = c(1.56649042,-1.87675892,-1.80424434,1.72693416,1.5787399,-1.86329892,-1.6789665,-1.6568188,-1.86840369,1.39048414,1.84550897,1.38801267,-1.80942931,1.78143388,1.69846066,1.56978846,1.77520343,-1.55898508,1.79985492,2.17939968,-1.57936357,-1.89272256,-1.98373825,2.01700136,1.40530492,-1.84020557,-1.84425835,-2.60720077,-2.08867432,-1.84536301,1.5702918,-1.77541872,-1.44684146,-2.06145142,1.67972282,-1.77577326,-1.63510231,1.34901378,1.89824526,-2.02095109,2.36706042,-1.73584855,1.36028805,1.59969963,1.75797169,2.45895289,-1.62727675,1.43298941,1.77236427,-1.58338037,-1.6589846,-1.64190355,-2.2859511,-2.2871833,-1.95949086,-2.27851687,3.1597624,-1.59762678,1.93588366,2.44329109,-1.77876207,1.72096759,1.96423548,1.7674994,2.33708957,-2.02085819,2.17943425,1.96427512,2.47608359,-1.8741578,2.18772316,-1.69511194,2.35213644,1.59062826,-1.82735184,-1.55143048,1.78143388),logp = c(3.16307,2.183779,2.481417,2.213655,2.225182,2.175182,2.33327,2.076203,3.048191,2.639413,2.415948,2.424919,2.275779,2.454661,2.507648,2.716042,2.628121,2.056823,2.690471,3.260036,2.911379,2.155653,2.175591,3.429587,2.244559,2.165071,2.327765,3.174527,2.48279,2.461853,2.366302,2.20657,2.231255,3.239911,2.199472,2.370887,2.28479,2.290686,3.111832,2.966969,3.623449,2.325613,2.1868,2.049223,2.065346,3.364917,2.113838,2.412649,2.263531,2.102176,2.539142,3.330895,3.094797,3.31816,2.776573,3.002339,7.517751,3.690766,3.759602,4.018759,2.245998,2.477856,2.353492,3.37967,3.957788,2.39418,3.659539,2.911672,4.604996,2.369712,3.320643,2.075087,4.50423,2.330635,2.416558,2.115206,2.454661)),row.names = c(NA,-100L),class = c("tbl_df","tbl","data.frame"))  

解决方法

根据@tjebo 的回答,这是否为您提供了所需的内容?

我在数据中添加了一个规范化的“强度”变量,并使用了它。使用 rescale() 值可以更改 alpha 的强度,并获得“~2.3 = 0.75 强度”关系。

library(tidyverse)

data_grey <- BT_Ctrl %>%
  filter(logp > 0 & logp < (-log(0.1)) | (logp > (-log(0.1)) & diff > (-1) & diff < 0)) %>% 
  mutate(intensity = 0.05)

data_color <-  BT_Ctrl %>%
  filter(logp > (-log(0.1)) & diff < (-1) | (logp > (-log(0.1)) & diff > 0)) %>%
  mutate(group = ifelse(diff > 0,"Tumor","Ctrl")) %>% 
  mutate(intensity = scales::rescale(x = exp(logp),to = c(0.05,30)))

ggplot(mapping = aes(x = diff,y = logp)) +
  geom_point(data = data_color,shape = 21,aes(fill = group,size = logp,alpha = intensity)) + 
  geom_point(data = data_grey,alpha = 0.1,fill = "grey50") +
  scale_alpha_identity(guide = "none") +
  scale_y_continuous(limits = c(0,8))

enter image description here

,

不确定这是否是您真正想要的,但我认为您只需要 ggnewscale


编辑

遗憾的是,ggnewscale::new_scale("alpha") 在这种情况下似乎不起作用 - 为新的 alpha 美学设置新的范围/限制失败。我认为如果问题是较低值的“太密集”填充,您可以更改 logp 值的比例,例如与exp(logp)。较大的值将远离较小的值,从而导致与较低 alpha 的差异更大。

library(tidyverse)

data_grey <- # I prefer creating data frames outside of ggplot calls if more complex
  BT_Ctrl %>%
  filter(logp > 0 & logp < (-log(0.1)) | (logp > (-log(0.1)) & diff > (-1) & diff < 0))

data_color <-
  BT_Ctrl %>%
  filter(logp > (-log(0.1)) & diff < (-1) | (logp > (-log(0.1)) & diff > 0)) %>%
  mutate(group = ifelse(diff > 0,"Ctrl"))

ggplot(mapping = aes(x = diff,y = logp,alpha = exp(logp))) +
  geom_point(data = data_color,size = logp)) + 
  geom_point(data = data_grey,fill = "grey50") +
  scale_alpha(range = c(0.05,1),guide = "none")  

# sadly does not work
# ggnewscale::new_scale("alpha") + scale_alpha(...)

reprex package (v2.0.0) 于 2021 年 7 月 21 日创建

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