ggplot 中的错位点

Misplaced points in ggplot

我正在读取这样的文件:

genes<-read.table("goi.txt",header=TRUE, row.names=1)
control<-log2(1+(genes[,1]))
experiment<-log2(1+(genes[,2]))

并将它们绘制成 ggplot 中的简单散点图:

ggplot(genes, aes(control, experiment)) +
    xlim(0, 20) + 
    ylim(0, 20) +
    geom_text(aes(control, experiment, label=row.names(genes)),size=3)

但是我的图上的点不正确(见附图)

这是我的数据:

          control     expt
gfi1     0.189634  3.16574
Ripply3 13.752000 34.40630
atonal   2.527670  4.97132
sox2    16.584300 42.73240
tbx15    0.878446  3.13560
hes8     0.830370  8.17272
Tlx1     1.349330  7.33417
pou4f1   3.763400  9.44845
pou3f2   0.444326  2.92796
neurog1 13.943800 24.83100
sox3    17.275700 26.49240
isl2     3.841100 10.08640

如您所见,'Ripply3' 显然在图表上的错误位置!

我是不是在做傻事?

ggplot 使用的 aes() 函数首先在您通过 data = genes 提供的数据框中查找。这就是为什么您可以(并且应该)仅通过像 control 这样的裸列名称来指定变量的原因; ggplot 将自动知道在哪里可以找到数据。

但 R 的作用域系统是这样的,如果在当前环境中找不到任何具有该名称的东西,R 将在父环境中查找,依此类推,直到它到达全局环境,直到找到具有该名称的东西。

因此 aes(control, experiment) 在数据框 genes 中查找名为 controlexperiment 的变量。它找到原始的、未转换的 control 变量,但当然 genes 中没有 experiment 变量。所以它继续沿着环境链向上延伸,直到它到达全局环境,您在其中定义了独立变量 experiment 并使用了它。

你打算做更像这样的事情:

genes$controlLog <- log2(1+(genes[,1]))
genese$exptLog <- log2(1+(genes[,2]))

其次是:

ggplot(genes, aes(controlLog, exptLog)) +
     xlim(0, 20) + 
     ylim(0, 20) +
     geom_text(aes(controlLog, exptLog, label=row.names(genes)),size=3)