在 R 中使用 image():如何在 x 轴上左对齐刻度线?

Using image() in R: How to left-align tick marks on x-axis?

我正在根据由 0 和 1 行组成的数据 table 制作双色图形,如下所示:

mem/Bur_05_sorted.bam_A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
mem/Bur_05_sorted.bam_B 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
mem/Ell_06_sorted.bam_A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
mem/Ell_06_sorted.bam_B 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
mem/Ell_07_sorted.bam_A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
mem/Ell_07_sorted.bam_B 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
mem/Ste_01_sorted.bam_A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
mem/Ste_01_sorted.bam_B 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
mem/Sto_02_sorted.bam_A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
mem/Sto_02_sorted.bam_B 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 
mem/Sto_03_sorted.bam_A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
mem/Sto_03_sorted.bam_B 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
mem/Sto_07_sorted.bam_A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
mem/Sto_07_sorted.bam_B 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
mem/Vog_01_sorted.bam_A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
mem/Vog_01_sorted.bam_B 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
mem/Vog_02_sorted.bam_A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
mem/Vog_02_sorted.bam_B 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
mem/Vog_03_sorted.bam_A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
mem/Vog_03_sorted.bam_B 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
mem/Vog_04_sorted.bam_A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
mem/Vog_04_sorted.bam_B 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
mem/Vog_05_sorted.bam_A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
mem/Vog_05_sorted.bam_B 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
mem/Vog_06_sorted.bam_A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
mem/Vog_06_sorted.bam_B 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

使用此代码:

a<-read.table("L_1616.vit.txt",row.names=1)

rowlabs = c("Bur_05_A","Bur_05_B","Ell_06_A","Ell_06_B","Ell_07_A","Ell_07_B","Ste_01_A","Ste_01_B","Sto_02_A","Sto_02_B","Sto_03_A","Sto_03_B","Sto_07_A","Sto_07_B","Vog_01_A","Vog_01_B","Vog_02_A","Vog_02_B","Vog_03_A","Vog_03_B","Vog_04_A","Vog_04_B","Vog_05_A","Vog_05_B","Vog_06_A","Vog_06_B")

columnlabs = c(0:(ncol(a)-1))*0.25

x11()
par(mar=c(5,6,4,2)+.1)
image(t(as.matrix(a)),col=c("blue","red"),axes=F)
axis(1,at=seq(0,2,length.out=ncol(a)), labels=columnlabs,las=2)
axis(2,at=seq(1,0,length.out=nrow(a)), labels=rowlabs, las=1)
savePlot("./plots/L_1616.png","png")

在图中,每个 "block" 的刻度线都居中。

但是,我希望刻度线与每个 "block" 的左中心对齐。像这样:

我怎样才能做到这一点? 谢谢!

您需要在 axis(1,...) 调用中使用 'at' 位置,这决定了刻度线的放置位置。
默认情况下,image() 以从 0 到 1 的等间距值为中心绘制每个块,因此如果图像上有 n 个块,则每个块的宽度为 1/n。所以你需要生成一系列 'at' 位置,这些位置向左偏移 1/2n。

data=matrix(sample(1:2,192,replace=T),ncol=16)
image(data,axes=F)
x_tick_offset=1/(2*nrow(data))
y_tick_offset=1/(2*ncol(data))
axis(1,at=seq(0,1,length.out=nrow(data))-x_tick_offset,labels=letters[1:nrow(data)])
axis(2,at=seq(1,0,length.out=ncol(data))+y_tick_offset,labels=1:ncol(data),las=2)