R ChromoMap:显示图例和散点图 y 轴

问题描述 投票:0回答:1

我目前正在使用 R 中的 ChromoMap 包绘制图形。我想知道是否有一种方法可以使用科学记数法(即 0.0005 -> 5e-4)显示散点图的 y 轴。同样,图例显示为 0.0 -> 0.0,因为数字太小而无法显示。

样本数据:

chromosomes_sort <- data.frame(V1=c(1,2,3), V2=c(0, 0, 0), V3=c(20672072, 27257494, 24117510))
marker_ann_trans <- data.frame(rs=c("1:201000\\G,\\C", "2:930284\\C,\\T", "3:478390\\G,\\A", "1:293904\\C,\\G", "2:3424802\\C,\\T", "3:1058284\\A,\\G"), chr=c(1, 2, 3, 1, 2, 3), ps=c(201000, 930284, 478390, 293904, 3424802, 1058284), ps_end=c(201001, 930285, 478391, 293905, 3424803, 1058285), p_wald=c(0.0001902909, 0.0004996678, 0.0003569823, 0.0003602867, 0.0001265872, 0.0001001598))

当前剧情脚本:


chromoMap(ch.file=list(chromosomes_sort), 
          data.files=list(marker_ann_trans),
          n_win.factor = 3,  
          data_based_color_map = T, 
          data_type = "numeric",
          canvas_width = 1400, 
          canvas_height = 1400, 
          left_margin = 80, 
          interactivity = F,
          legend = c(T), 
          lg_y = 750, 
          plot.legend.labels = c("Wald p-val"), 
          data_colors = list(c("red2","blue")), 
          plots = "scatter", 
          ch_gap = 0.1, 
          ref_line = T,
          plot_color = c("black"))

输出:

enter image description here

不幸的是,我无法在包的文档中找到任何解决方案。

r plot legend
1个回答
0
投票

这个功能有很多选项,但我只能想出一个解决方法。

此解决方案使用 JS 和库

htmlwidgets
来更改制作后的绘图。我不知道您是否想要
5e-4
5 x 10
-4
的指数格式(后者是我一直想到的,但从技术上讲不是“指数格式”)。

此代码旨在更改这两种格式中的任何一种格式的代码。

在函数

htmlwidgets::onRender
中的 Javascript 末尾,您将看到
data.frame(...
以及注释
# alternate choices are "exponential" and  "by 10"
。这两个选择将改变您的值的格式。

  • 目前是
    choice = "exponential"
    ,所以当您按原样绘制此代码时,您会看到
    5e-4
    等类似内容(在第一张图片中)
  • 将数据框更改为
    choice = "by 10"
    ,您的绘图将被格式化为
    5 x 10
    -4
    (在第二张图片中)
chromoMap(ch.file=list(chromosomes_sort), 
          data.files=list(marker_ann_trans),
          n_win.factor = 3,  
          data_based_color_map = T, 
          data_type = "numeric",
          canvas_width = 1400, 
          canvas_height = 1400, 
          left_margin = 80, 
          interactivity = F,
          legend = c(T), 
          lg_y = 750, 
          plot.legend.labels = c("Wald p-val"), 
          data_colors = list(c("red2","blue")), 
          plots = "scatter", 
          ch_gap = 0.1, 
          ref_line = T,
          plot_color = c("black")) |> 
  htmlwidgets::onRender(
    "function(el, x, data) {
      tellMe = document.querySelectorAll('g text'); /* find all labels */
                     /* filter for labels that only contain numbers and decimal point*/
      xx = [...tellMe].map((_, i) => i ).filter(e => /^\\d*\\.?\\d*$/.test(tellMe[e].innerHTML) === true);
                     /* convert values to scientific notation */
      if(data.choice[0] === 'exponential') {        /* exponential mode chosen */
        xx.map(i => tellMe[i].innerHTML = Number(tellMe[i].innerHTML).toExponential()); /* change text */
      } else if (data.choice[0] === 'by 10') {      /* by 10 mode chosen */
                     /* get superscript shift size based on font size */
        ss = Number(window.getComputedStyle(tellMe[xx[1]]).fontSize.replace(/[^\\d]+/, '')) * -.2;
        xx.map(i => tellMe[i].innerHTML = '<tspan>' + Number(tellMe[i].innerHTML).toExponential().replace(/e\\+?/, ' x 10<tspan dy=' + ss + '>')  + '</tspan></tspan>');
      }
    }", data.frame(choice = "by 10")   # alternate choices are "exponential" and  "by 10"
  )

在这张图片中,我添加了参数

plot_height = c(60)
,以便值更清晰。

exp mode

因为文本太宽,所以我将参数

left_margin
更改为 100(您在问题中将其设置为 80)。我还使用
plot_height = c(60)
使文本更清晰。

by 10 mode

© www.soinside.com 2019 - 2024. All rights reserved.