【问题标题】:R: log transform linear fit of geom_smoothR:geom_smooth 的对数变换线性拟合
【发布时间】:2015-05-30 06:46:17
【问题描述】:

我正在尝试使用 R 中的 ggplot2 制作具有对数 x 轴和正常缩放 y 轴的图形。这一切都很好,但是当我使用 model="lm" 添加平滑器时,我遇到了问题。
我想要的是通过我的数据对数转换之前拟合线性模型,然后对其进行对数转换,因此 geom_smooth 拟合的线应该是弯曲的而不是直线。我已经找到了一种使用coord_trans(x="log10") 的方法,但如果我这样做,x 轴的刻度线都会乱七八糟。

到目前为止,我所拥有的是:

require(ggplot2)
require(colorspace)
require(scales)

C<-c(221562500,22156250,2215625,221562.5,360000000,36000000,3600000,360000)
OD400<-c(1.304,0.130,0.011,0.001,2.095,0.231,0.020,0.001)
OD700<-c(0.991,0.100,0.007,0.000,1.452,0.179,0.012,0.000)
mydata<-data.frame(C,OD400,OD700)

p<-ggplot() +
  geom_point(data=mydata,aes(x=C,y=OD400,colour="red")) +
  geom_point(data=mydata,aes(x=C,y=OD700,colour="green")) +
  scale_colour_manual("Wavelength", breaks=c("red","green"), labels=c("400 nm","700 nm"),
                     values=rainbow_hcl(2,c=80,l=60)) +
  scale_x_continuous(trans = log10_trans(),
                     breaks = trans_breaks("log10", function(x) 10^x),
                     labels = trans_format("log10", math_format(10^.x))) +
  annotation_logticks(sides="tb") +
  labs(x="Concentration [conidia/mL]",y="Absorption") +
  theme_bw() +  theme(panel.grid.minor = element_blank())

我要补充的是:

p<-p + geom_smooth(data=mydata,aes(x=C,y=OD400),method="lm")
p<-p + geom_smooth(data=mydata,aes(x=C,y=OD700),method="lm")

但是对数变换之前,并且拟合曲线也进行对数变换。

【问题讨论】:

  • 通过lm() + predict()(不是通过ggplot)计算回归,然后将其添加到绘图中。
  • 我之前尝试过类似的东西。我要做的是用lm() 函数计算线性模型,然后用geom_abline() 添加回归曲线。但是,这种方法不起作用,并给出了相当奇怪的结果。你能用predict() 函数澄清你的建议吗?您是否会将预测点添加到绘图中,但作为与geom_line() 的线?
  • 我试图用geom_line() 绘制由lm() + predict() 计算的回归,但是虽然它被转换了,但它并没有产生一个漂亮的曲线,因为geom_line() 只是连接了由以下计算的几个点predict()...
  • 尝试将一组细粒度的newdata 传递给predict,跨越您的域,例如predict(..., newdata=data.frame(x=seq(0, 10, by=0.0001)))

标签: r ggplot2 transform smooth


【解决方案1】:

我想我可以使用以下代码得到你想要的:

########################################
# original code without transformation #
########################################

require(ggplot2)
require(colorspace)
require(scales)

C<-c(221562500,22156250,2215625,221562.5,360000000,36000000,3600000,360000)
OD400<-c(1.304,0.130,0.011,0.001,2.095,0.231,0.020,0.001)
OD700<-c(0.991,0.100,0.007,0.000,1.452,0.179,0.012,0.000)
mydata<-data.frame(C,OD400,OD700)

p<-ggplot() +
  geom_point(data=mydata,aes(x=C,y=OD400,colour="red")) +
  geom_point(data=mydata,aes(x=C,y=OD700,colour="green")) +
  scale_colour_manual("Wavelength", breaks=c("red","green"), labels=c("400 nm","700 nm"),
                 values=rainbow_hcl(2,c=80,l=60)) +
#  scale_x_continuous(trans = log10_trans(),
#                 breaks = trans_breaks("log10", function(x) 10^x),
#                 labels = trans_format("log10", math_format(10^.x))) +
#  annotation_logticks(sides="tb") +
  labs(x="Concentration [conidia/mL]",y="Absorption") +
  theme_bw() +  theme(panel.grid.minor = element_blank())


##################
# print raw plot #
##################

p

####################################
# fit lines (copied from question) #
####################################

p<-p + geom_smooth(data=mydata,aes(x=C,y=OD400),method="lm")
p<-p + geom_smooth(data=mydata,aes(x=C,y=OD700),method="lm")


#######################################
# print untransformed plot with lines #
#######################################

p

###################################################
# transform x-axis (as mentioned in the question) #
###################################################

p<-p+coord_trans(x="log10")


#####################################
# print transformed plot with lines #
#####################################

p

如您所见,代码基本上是从问题中复制粘贴的,并返回以下图表:

在问题中,关于coord_trans

我已经找到了一种使用 coord_trans(x="log10") 的方法,但是如果我这样做,x 轴的刻度线都会乱七八糟。

我看不出这是我的阴谋。

【讨论】:

    猜你喜欢
    • 2015-03-14
    • 2019-05-09
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 2019-03-15
    • 2017-06-27
    • 2021-07-29
    • 2013-05-22
    相关资源
    最近更新 更多