r - 如何在对数图中添加趋势线(ggplot2)?
问题描述
我需要绘制一个遵循幂律分布的数据向量。因此,如果我将它们绘制在对数轴上,它们将是一条直线。但是,如果我没有明确提供“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 <- data.frame(con_rns =con_rns[con_rns<1000],col=sample(1:3,size = length(con_rns[con_rns<1000]),replace = T))
。如何在对数轴上绘制不同的色点组和色线组?像这样:
解决方案
一种方法是使用从图中恢复分箱数据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 变换应用于零时,这将返回一个警告,给出一个无限值。这些点将从图中删除并在趋势线中被忽略。
推荐阅读
- python-3.x - 与 Cassandra 的连接问题 python
- javascript - 如何使用 javascript 或 jquery 创建按钮的动态 tbody onclick
- java - JavaFX如何制作动态相机,如何限制视口可见性
- c++ - 在非实例化模板中使用 static_assert 的正确方法是什么?
- json - 在 play scala 的单元测试中模拟 WsClient
- python - 我无法删除产品
- ios - iOS 订阅 latest_receipt_info
- visual-studio-code - VS Code 无法启动 Bash
- botframework - 创建访问器后无法写入机器人状态属性
- python - ValueError:不支持 ssd_inception_v3。有关与不同版本 TensorFlow 兼容的特征提取器,请参阅 `model_builder.py`