ggplot2绘制水平线位置异常问题求助
问题原因与解决方案
核心原因
你通过format(dt$Value, digits = 2)将原本数值型的Value列转换成了字符型,这导致ggplot2自动将y轴识别为离散分类轴,而非你预期的连续数值轴:
- 离散轴的刻度会按字符排序,你的
Value字符值排序后为"0.23"、"0.53"、"1"、"1.23",每个刻度对应一个整数位置索引(1、2、3、4)。 geom_hline的yintercept = as.numeric(subset(dt, ID == "Line")$Value)得到的是数值1,在离散轴中这个数值对应的是第一个刻度的位置(即"0.23"所在的位置),所以水平线出现在了错误的位置。
修复方案
不要修改原始Value列的数值类型,仅在需要显示文本标签时对数值进行格式化即可:
dt <- data.frame(ID = c("Line", "P1", "P2", "P3"), Year = "2016", Value = c(1, 0.533, 1.233, 0.233)) library(ggplot2) ggplot(NULL) + geom_point(data = subset(dt, ID != "Line"), aes(x = Year, y = Value, color = ID, shape = ID)) + geom_text(data = subset(dt, ID != "Line"), aes(label = format(Value, digits = 2), # 仅在标签处格式化数值 x = Year, y = Value)) + geom_hline(yintercept = subset(dt, ID == "Line")$Value, # 直接使用原始数值 color = "red") + theme_bw()
这样y轴会保持为连续数值轴,红色水平线会正确显示在y=1的位置,同时散点的文本标签也会显示格式化后的两位小数。
内容的提问来源于stack exchange,提问作者T X
相关产品推荐
相关产品推荐

