【问题标题】:How to add trend line in a log-log plot (ggplot2)?如何在对数图中添加趋势线(ggplot2)?
【发布时间】:2018-11-18 12:15:00
【问题描述】:

我需要绘制一个遵循幂律分布的数据向量。因此,如果我将它们绘制在对数轴上,它们将是一条直线。 但是,如果我没有明确提供“y”参数,我不知道如何绘制。 这是代码

library("poweRlaw")
library("ggplot2")

xmin = 1; alpha = 1.5
con_rns = rplcon(1000, xmin, alpha)
#convert to data.frame format for ggplot2
df <- data.frame(con_rns =con_rns[con_rns<1000])

#make plot with both axes log scale
ggplot(data = df, aes(x = con_rns))+
  geom_point(stat = 'bin', binwidth = 0.1)+
  geom_smooth(stat = 'bin',mapping = aes(x=con_rns),method = "lm",se=FALSE)+
  scale_x_log10() + 
  scale_y_log10()

结果是这样的:

但我想要这个

我知道,我可以手动分箱数据,明确提供“y”,然后绘制线,像这样

ggplot(data = data.frame(a = rnorm(50,0,1),b=5+rnorm(50,2,1)),mapping = aes(x = a,y=b))+
  geom_point()+
  geom_smooth(method = "lm",se=FALSE)

结果:

但我想知道,如何使用此代码 (geom_point(stat = 'bin', binwidth = 0.1)) 绘制趋势线。它隐式计算数据仓。

PS: 好吧,谢谢克里斯的回答。我还是有问题。如果我想绘制不同的组,我该如何绘制它?数据为 df &lt;- data.frame(con_rns =con_rns[con_rns&lt;1000],col=sample(1:3,size = length(con_rns[con_rns&lt;1000]),replace = T)) 。如何在对数轴上绘制不同的色点组和色线组?像这样:

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    一种方法是使用ggplot_build()从图中恢复分箱数据

    首先我制作了没有最佳拟合线的情节:

    p <- ggplot(data = df, aes(x = con_rns))+
      geom_point(stat = 'bin', binwidth = 0.1)+
      scale_x_log10() + 
      scale_y_log10() 
    

    然后我添加了绘图中的分箱数据,可以使用 ggplot_build(p)$data 找到(并反转 log10 转换)

    p + geom_smooth(data = ggplot_build(p)$data[[1]], 
                  mapping = aes(x=10^x, y= 10^y),method = "lm",se=FALSE)
    

    更新: 另一个问题是如何按不同的颜色组分割图。我以同样的方式处理这个问题,但我有必要创建一个“群体”美学,以便可以将这些数据保存在 ggplot_build 数据中。

    library(poweRlaw)
    library(ggplot2)
    
    xmin = 1; alpha = 1.5
    con_rns = rplcon(1000, xmin, alpha)
    #convert to data.frame format for ggplot2
    df <- data.frame(con_rns =con_rns[con_rns<1000],col=sample(1:3,size = length(con_rns[con_rns<1000]),replace = T))
    
    p <- ggplot(data = df, aes(x = con_rns))+
      geom_point(stat = 'bin', binwidth = 0.1, aes(colour=factor(col), group=factor(col)))+
      scale_x_log10() + 
      scale_y_log10() 
    
    
    p + geom_smooth(data = ggplot_build(p)$data[[1]], 
                    mapping = aes(x=10^x, y= 10^y, colour=factor(group)),method = "lm",se=FALSE)
    

    请注意,现在我们已经对数据进行了分组,其中一些组的 bin 中的计数为零。当 log10 变换应用于零时,这将返回一个警告,给出一个无限值。这些点将从图中移除并在趋势线中被忽略。

    【讨论】:

    • 很好,谢谢。我还想知道一些隐式变量。例如,使用“..density..”将geom_bar 转换为geom_histogram .. ggplot 计算一些变量,例如“..density..”。如何在 ggplot 的统计变换中获取这些变量?
    • 我认为如果您使用y=..density.. 创建一个新情节,该过程将是相同的,但我不完全确定我是否理解这个问题。也许提出一个新问题?
    • 好吧,我可以考虑另一个问题。但是如果我想绘制不同的组,我该怎么画呢?数据是 'df &lt;- data.frame(con_rns =con_rns[con_rns&lt;1000],col=sample(1:3,size = length(con_rns[con_rns&lt;1000]),replace = T)) 。如何在对数轴上绘制不同的色点组和色线组?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    相关资源
    最近更新 更多