Geom_smooth 不在 ggplot2 上绘制
Geom_smooth doesn't plot on ggplot2
我正在尝试制作平滑曲线,但我不知道为什么不起作用。
这是我的数据集
data.fam
###specnumber_f site position
23 MS on
9 MS on
11 CU on
9 CA on
21 CF on
17 ST on
6 AB on
4 AB on
8 AB on
3 FN off
4 FN off
14 RO off
6 RO off
7 SPSP off
4 SPSP off
3 SPSP off
我需要 x 轴遵循此站点顺序
lat.order <- factor(data.fam$site, levels=c("MS", "CU", "CA", "CF", "ST", "AB", "FN",
"RO", "SPSP"))
然后,我尝试了这段代码,但 geom_smooth 没有绘图,我相信这是一个简单的答案,我无法解决它
ggplot(data.fam, aes(x=as.factor(lat.order), y=specnumber_f))+
geom_point(aes(colour = factor(position)), size = 2)+
geom_smooth()
OP。你的线没有显示的原因是你的 x 轴值是离散的。实际上,ggplot2
不知道如何沿 x 轴连接数据,因为对于离散数据,没有明显的理由要沿该轴连接。
这里有两个通用的解决方案。一个很简单,给你一条边缘硬的线,而另一个更复杂,但你会得到一条边缘完全光滑的线。
简单的解决方案:线条不平滑
要得到一条“不平滑”的线,您需要做的就是告诉 ggplot2
沿 x 轴的点都在那个维度上相连,并且它应该使用要分配给 x 轴的级别。如果不以数字方式处理刻度,就无法计算沿该轴的公式,因此这是必要的。由于在这种情况下轴仍然是离散的,因此如果它位于沿 x 的任意两个值之间,则没有任何意义,因此您得到的线将是 angular(不平滑)。感谢@teunbrand 提供此解决方案:
ggplot(data.fam, aes(x=site, y=specnumber_f)) +
geom_point() + geom_smooth(aes(group=-1))
获得平滑的线条
如果您对简单的解决方案在美学上感到满意,那么它是最简单的,所以请采用它。如果你真的想要一条平滑的线,这里有一种方法可以做到。基本思想是我们需要将您的离散轴更改为连续轴。问题是 data.fam$site
不是连续的。因此,我们需要基本上将 data.fam$site
的值映射到另一个数字列,然后使用 scale_x_continous()
来标记我们的轴,并使用 data.fam$site
.
中的正确名称
首先,我们将轴标签的顺序放在一边:
lat.order.levels <- c("MS", "CU", "CA", "CF", "ST", "AB", "FN",
"RO", "SPSP")
然后,我们制作另一个数据框,用于将我们的连续列(此处为 site_num
)映射到原始数据框,data.fam
。
site.data <- data.frame(
site = lat.order.levels,
site_num = 1:length(lat.order.levels)
)
最后,我们合并两帧,保留所有点在data.fam
中。我为此创建了一个新的 data.frame df
:
df <- dplyr::left_join(data.fam, site.data, by= "site")
对于绘图,您将 x
美学分配给 site_num
,并使用 lat.order.levels
通过 scale_x_continuous()
标记轴。
ggplot(df, aes(x=site_num, y=specnumber_f)) +
geom_point() + geom_smooth() +
scale_x_continuous(
breaks=1:length(lat.order.levels),
labels=lat.order.levels
)
我正在尝试制作平滑曲线,但我不知道为什么不起作用。 这是我的数据集
data.fam
###specnumber_f site position
23 MS on
9 MS on
11 CU on
9 CA on
21 CF on
17 ST on
6 AB on
4 AB on
8 AB on
3 FN off
4 FN off
14 RO off
6 RO off
7 SPSP off
4 SPSP off
3 SPSP off
我需要 x 轴遵循此站点顺序
lat.order <- factor(data.fam$site, levels=c("MS", "CU", "CA", "CF", "ST", "AB", "FN",
"RO", "SPSP"))
然后,我尝试了这段代码,但 geom_smooth 没有绘图,我相信这是一个简单的答案,我无法解决它
ggplot(data.fam, aes(x=as.factor(lat.order), y=specnumber_f))+
geom_point(aes(colour = factor(position)), size = 2)+
geom_smooth()
OP。你的线没有显示的原因是你的 x 轴值是离散的。实际上,ggplot2
不知道如何沿 x 轴连接数据,因为对于离散数据,没有明显的理由要沿该轴连接。
这里有两个通用的解决方案。一个很简单,给你一条边缘硬的线,而另一个更复杂,但你会得到一条边缘完全光滑的线。
简单的解决方案:线条不平滑
要得到一条“不平滑”的线,您需要做的就是告诉 ggplot2
沿 x 轴的点都在那个维度上相连,并且它应该使用要分配给 x 轴的级别。如果不以数字方式处理刻度,就无法计算沿该轴的公式,因此这是必要的。由于在这种情况下轴仍然是离散的,因此如果它位于沿 x 的任意两个值之间,则没有任何意义,因此您得到的线将是 angular(不平滑)。感谢@teunbrand 提供此解决方案:
ggplot(data.fam, aes(x=site, y=specnumber_f)) +
geom_point() + geom_smooth(aes(group=-1))
获得平滑的线条
如果您对简单的解决方案在美学上感到满意,那么它是最简单的,所以请采用它。如果你真的想要一条平滑的线,这里有一种方法可以做到。基本思想是我们需要将您的离散轴更改为连续轴。问题是 data.fam$site
不是连续的。因此,我们需要基本上将 data.fam$site
的值映射到另一个数字列,然后使用 scale_x_continous()
来标记我们的轴,并使用 data.fam$site
.
首先,我们将轴标签的顺序放在一边:
lat.order.levels <- c("MS", "CU", "CA", "CF", "ST", "AB", "FN",
"RO", "SPSP")
然后,我们制作另一个数据框,用于将我们的连续列(此处为 site_num
)映射到原始数据框,data.fam
。
site.data <- data.frame(
site = lat.order.levels,
site_num = 1:length(lat.order.levels)
)
最后,我们合并两帧,保留所有点在data.fam
中。我为此创建了一个新的 data.frame df
:
df <- dplyr::left_join(data.fam, site.data, by= "site")
对于绘图,您将 x
美学分配给 site_num
,并使用 lat.order.levels
通过 scale_x_continuous()
标记轴。
ggplot(df, aes(x=site_num, y=specnumber_f)) +
geom_point() + geom_smooth() +
scale_x_continuous(
breaks=1:length(lat.order.levels),
labels=lat.order.levels
)