当 x 轴为分类变量时,如何给一条水平线标注?

5

这里有一个示例,展示了如何使用ggplot2在R中标记一条直线。请看第5个示例 - "重新创建按经度划分的航班数量图表"。

如果x轴是分类变量而不是连续变量,该如何编写代码?如何编写geom_text语法的部分,而不是当前的部分?

data = data.frame(x = - 119, y = 0) 

我创建了一条线。
 + geom_text(aes(x,y, label = "seronegative"), 
             data = data.frame(x = 1, y = 20), 
             size = 4, hjust = 0, vjust = 0, angle = 0)

我尝试了几种选项

data = data.frame(x = 1, y = 20)
data = data.frame(x = factor(1), y = 20)
#where gard is the name of one of the categories
data = data.frame(x = "gard", y = 20) 

...但是我收到了错误提示

一元运算符的参数无效


请注意,在您链接的示例中,分类的x变量没有意义,因为该图显示的是连续密度估计。 - joran
@joran 你说得很对。关于图表的可理解性,工作示例中永远不可能有一个分类的x轴,但是关于绘制文本标签的原则,它可以很容易地使用分类值。 - Farrel
1个回答

7

我并不完全清楚你想要做什么,因为你说你想创建一条线,但是你的代码使用了geom_text。假设你想要放置一条垂直线,并在该线上垂直放置一个文本标签,使用分类变量x,以下是一个简单的示例:

dat <- data.frame(x = letters[1:5],y = 1:5)
txt <- data.frame(x = 1.5, y = 1, lab = "label")

ggplot(dat,aes(x = x, y = y)) + 
    geom_point() + 
    geom_vline(xintercept = 1.5) + 
    geom_text(data = txt,aes(label = lab),angle = 90, hjust = 0, vjust = 0)

在我的电脑上运行该代码后,输出结果如下:

enter image description here

请注意,我将文本标签放在了一个单独的数据框中,位于 ggplot 调用之外。这并不是严格必要的,但我喜欢这样做,因为我觉得这能避免一些混淆。

在此处使用x值为1.5的文本标签是有效的,如果您想要它直接放在绘制的x值上,可以将其设置为"a"。

您所描述的错误提示向我表明您的代码中可能存在简单的语法错误(因为您没有完全提供)。也许这个例子可以帮助您找出问题所在。


+1,此外,当您添加一个通常期望连续值的层时,您可以通过使用与分类变量因子水平对应的数字来欺骗位置。也就是说,不需要定义单独的data.frame(),只需要为geom_text()提供x=y=即可。 - Brandon Bertelsen
geom_text(aes(x=1, y=1.5,label = lab),angle = 90, hjust = 0, vjust = 0) - Brandon Bertelsen
修改后,我明确表示我的使用分离数据框是一种风格判断。 - joran
@joran 我想你说得对,我可能有一些语法错误。无论我做什么,我都会收到“一元运算符的参数无效”的错误提示。最终我让它工作了,但我不知道是怎么做到的。可能是一个杂乱的反引号。这是我的完整代码,现在它可以正常工作了。 ggplot(syrclia,aes(cls.grp,HPV6AB))+ geom_jitter(size=4,position=position_jitter(width=.15))+scale_y_log10()+ geom_hline(aes(yintercept=c(20,81.3,1065.6)))+xlab("group")+ylab("anti-HPV 6 GMT (mMU/ml)")+ geom_text(aes(x=c(4.2,4.2),y=c(11,33), label = c("seronegative","seropostive")), angle=90)。感谢您的帮助。 - Farrel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接