我正在尝试生成 geom_point() 图,但是当我运行代码时,它会将 y 轴折叠成应有的一小部分。
我正在使用我的教授提供给我的一组代码。
ggplot() +
geom_point(data=data.scores,aes(x=NMDS1,y=NMDS2,colour=grp, size = SpDiv)) +
geom_text(data=data.scores,aes(x=NMDS1,y=NMDS2,label=Stations),size=6,vjust=0) +
scale_size(range = c(.1, 24), name="Species Diversity")+
coord_equal() +
theme_bw()
我尝试添加另一行代码来强制 y 轴更长:
scale_y_continuous(name="NMDS2", limit=c(0.1,24))
但这导致了这样的结果:
这是怎么回事,我该如何解决?这不是我自己的代码,所以我没有从头开始编写它,并且有些元素对我来说完全陌生,所以我不知道这是否是我完全忽略的东西。
如评论中所述,您的轴不稳定,因为
coord_equal
设置强制轴使用相同的单位。由于您的图表的宽度远大于高度,这会导致它被压扁,而您教授的数据分布更广泛。然而,如果轴不相等,NMDS 图可能会产生误导,因此删除它并不是最佳选择。考虑旋转数据,使它们占据对角线而不是单个轴。
set.seed(123)
library(vegan)
v <- c(rnorm(18), rnorm(18)+2) |>
matrix(ncol = 6) |>
metaMDS(autotransform = FALSE, distance = "euclidean")
初始数据又长又瘦,正如您所拥有的:
library(ggplot2)
ggplot(v$points) +
geom_point(aes(x=MDS1, y=MDS2)) +
coord_equal()
通过乘以旋转矩阵旋转45度:
rot_mat <- matrix(c(sqrt(2)/2, sqrt(2)/2, -sqrt(2)/2, sqrt(2)/2), ncol=2)
v$points%*%rot_mat |>
as.data.frame() |>
setNames(c("MDS1", "MDS2")) |>
ggplot() +
geom_point(aes(x=MDS1, y=MDS2)) +
coord_equal()
并且该图变得更容易解释。
或者,考虑您可以从 NMDS 中删除一些维度,而不会丢失太多信息 - 也许您只需要一个维度来实现足够的分离,而不是目前使用的 2+ 个维度。然后您就可以使用
geom_density
之类的东西来绘制数据。
set.seed(123)
v <- c(rnorm(18), rnorm(18)+2) |>
matrix(ncol = 6) |>
t() |>
metaMDS(autotransform = FALSE, distance = "euclidean", k = 1)
ggplot(v$points) +
geom_density(aes(x=MDS1, color=rep(c("A", "B"), each=3)))