r - 是否可以添加一个图例框,其中包含用 geom_text 编写的文本?

标签 r ggplot2

我想使用多个变量在 R 中绘制 NMDS。我已经在 geom_point 中使用了大小、形状和颜色。但是我有另一个变量,所以我将它作为数值包含在 geom_text 中,问题是我需要显示每个数字在另一个图例中的含义。是否可以在不改变尺寸、形状和颜色图例的情况下做到这一点?

这是我尝试过的

data1<-data.frame("Replicas" = c(1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3),
 "Part" = c("leg","leg","leg","arm","arm","arm","leg","leg","leg","arm","arm","arm","leg","leg","leg","arm","arm","arm","leg","leg","leg","arm","arm","arm"),
 "Species" = c("Spc1","Spc1","Spc1","Spc1","Spc1","Spc1","Spc2","Spc2","Spc2","Spc2","Spc2","Spc2","Spc3","Spc3","Spc3","Spc3","Spc3","Spc3","Spc4","Spc4","Spc4","Spc4","Spc4","Spc4"),
 "Habitat" = c("Cali","Cali","Cali","Cali","Cali","Cali","Delhi","Delhi","Delhi","Delhi","Delhi","Delhi","Fiji","Fiji","Fiji","Fiji","Fiji","Fiji","Fiji","Fiji","Fiji","Fiji","Fiji","Fiji"),
 "NMDS1" = c(-0.556,-0.001,-0.074,-0.352,-0.019,0.111,-0.235,-0.663,-0.34,-0.39,-0.41,-0.669,0.176,0.038,-0.038,0.158,-0.177,-0.19,0.462,0.496,0.348,0.472,0.502,0.42),               "NMDS2" = c(-0.085,0.035,0.134,-0.124,0.055,0.064,0.22,-0.133,0.061,0.285,-0.082,-0.425,0.686,0.587,0.494,0.46,0.29,0.309,0.183,0.16,-0.242,0.1,-0.067,-0.339)
)
data2 <- as.integer(as.factor(data1$Habitat)) #To assign numerical values to each factor included in Habitat    
ggplot(data1, aes(NMDS1, NMDS2)) + 
 geom_point(aes(colour=factor(data1$Part), size=factor(data1$Replicas), shape=factor(data1$Species))) + 
 geom_text(aes(x=NMDS1,y=NMDS2,label=data2))

enter image description here

我想在图例框中包含“栖息地”,显示 1 是卡利,2 是德里,3 是斐济。 请问有人可以帮帮我吗?

最佳答案

下面是获取文本图例的技巧。首先,对您的代码进行一些更改:

  • 不应在 aes 中重述数据框名称。应仅使用裸列名称。
  • 我在 data2 中创建了一个 hab.num 列,而不是用一个单独的向量来表示数字。使用单独的向量是危险的,因为它会破坏从给定数据框到各种绘图美学的列映射。它可能在特定情况下“有效”,但它很脆弱且容易出错。
  • data.frame 函数自动将字符列转换为因子(除非您添加参数 stringsAsFactors=FALSE),因此无需将这些列转换为因子对 ggplot 的调用。

好的,回到手头的问题:我们将把 hab.num 映射到 fill 美学,因为我们没有使用 fill 其他任何东西。那将创造一个传奇。然后我们将图例标签设置为所需的值,我们将去掉填充图例中的点标记,因为我们只需要文本标签。

library(tidyverse)

data1 = data1 %>% 
  mutate(hab.num = factor(recode(Habitat, Cali=1, Delhi=2, Fiji=3)))

ggplot(data1, aes(NMDS1, NMDS2)) + 
  geom_point(aes(colour=Part, size=factor(Replicas), shape=Species, fill=hab.num)) + 
  geom_text(aes(x=NMDS1,y=NMDS2,label=hab.num)) +
  scale_fill_discrete(labels=paste(levels(data1$hab.num), "=", levels(data1$Habitat))) +
  guides(fill=guide_legend(keywidth=unit(0,"mm"), override.aes=list(size=0, colour=NA))) +
  labs(size="Replicas", fill="Habitat") +
  theme_classic()

enter image description here

关于r - 是否可以添加一个图例框,其中包含用 geom_text 编写的文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58346811/

相关文章:

r - ggplot 箱线图中缺少值的箱宽一致

r - 在R中使用bs作为变量时从glm中提取结点

r - 在哪里(如果有的话)记录了非标准评估的危险?

r - 函数内 enquo() 和 toString() 之间的区别

r - 如何根据列条目向 ggplot2 中的 map 图添加额外的图例?

r - ggplot2 coord_polar 在使用填充时保留顺序

r - 如何不使用 R 绘制时间序列中的间隙

r - 比较字符串与 R 中的逻辑运算符

r - 如何按唯一编号删除多列中的行?

r - 如何强制 'polynom::polynomial' 对象中的尾随零? (特别是从 ggpubr 修改 stat_lm 和 stat_regline_equation 的行为)