R:ggplot 中的 X 轴不接受负值作为数字

Negative values not accepted as numeric for X-axis in R:ggplot

这可能很简单,但我无法解决。

我正在加载一个看起来像这样的数据集,但它从 -50 到 1500:

Name    ExpA    ExpB    -50     -49     -48     -47     -46    -45      -44
sampleA Light   Low     12.326  12.326  12.328  36.979  36.979  24.566  24.652
SampleB Light   High    0.0     9.333   9.3233  37.302  46.628  18.651  18.651
SampleC Dark    Low     0.0     0.0     0.0     13.575  40.725  27.150  0.0

我对数据进行了融化:

x.melt <-melt(x, id=c("Name","ExpA", "ExpB"))

x.melt
    Name    ExpA    ExpB    variable    value
1   SampleA Light   Low     -50     12.326402
2   SampleB Light   High    -50     0.000000
3   SampleC Dark    Low     -50     14.242440
4   SampleD Dark    High    -50     0.000000
9   SampleA Light   Low     -49     12.326402
10  SampleB Light   High    -49     9.325700
11  SampleC Dark    Low     -49     0.000000
12  SampleD Dark    High    -49     8.792096
...etc...

我想绘制数据。这在 x 轴以外的各个方面都很好用。如果我不在 x 轴调用中包含 'as.numeric()',那么它确定我的轴是一个离散变量。我的基本代码是:

p <- ggplot(data=x.melt, aes(x=as.numeric(variable), y=value, colour=ExpA))
p + 
  stat_smooth(method="loess", span=0.05, se=TRUE)

正如您所看到的,x 轴从零开始而不是 -50。

有没有办法正确解释轴调用的变量列?

我假设名为 variable 的列是一个因素。当您将一个因子转换为数字时,您是在告诉 R 您想要将该值替换为该值在该因子水平中的索引。例如,让

a <- c(3, -1, 1)
b <- factor(a)
b
# [1] 3  -1 1 
# Levels: -1 1 3

注意它是如何对级别进行排序的。所以当你调用as.numeric时,它会将-1的任何值替换为1,因为-1是第一级,以此类推。看到这个

as.numeric(b)
# [1] 3 1 2

有多种方法可以将因子转换为数值向量并保留值。一个有效的方法是这样做

as.numeric(levels(b))[b]
# [1]  3 -1  1

要解决您的具体问题,请尝试

p <- ggplot(data=x.melt, aes(x=as.numeric(levels(variable))[variable], y=value, colour=ExpA))
p + stat_smooth(method="loess", span=0.05, se=TRUE)