我目前正在使用 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"))
输出:
不幸的是,我无法在包的文档中找到任何解决方案。
这个功能有很多选项,但我只能想出一个解决方法。
此解决方案使用 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)
,以便值更清晰。
因为文本太宽,所以我将参数
left_margin
更改为 100(您在问题中将其设置为 80)。我还使用 plot_height = c(60)
使文本更清晰。