标记超出折线图中限制的值

时间:2019-01-25 17:35:11

标签: r ggplot2

让我们假设这个数据集

seed(1234)    
serial <- rep(1:50)
change <- rnorm(n=50, m=1, sd=1) 
data <- data.frame(serial, change)
summary(change)

现在让我们画一条线,

library(ggplot2)
ggplot(data, aes(x = serial, y = change)) + 
  geom_line() + 
  ylab(label="Change") + 
  xlab("Serial")

这给出了我的输出, enter image description here

现在,我要标记(大于红色的圆圈或序列号)高于2.0且低于-0.5的每个数据点。

任何想法该怎么做?

2 个答案:

答案 0 :(得分:2)

您可以在对geom_point的调用中重新定义数据集。然后使用xy的新值来仅绘制那些点。

library(ggplot2)

ggplot(data, aes(x = serial, y = change)) + 
  geom_line() + 
  geom_point(data = subset(data, change > 2.0 | change < -0.5),
             aes(x = serial, y = change, color = "red")) +
  ylab(label="Change") + 
  xlab("Serial")

enter image description here

要绘制数字serial的值,最好的方法是使用geom_text,并设置适当的label值。首先,我绘制大于2.0的值,然后绘制小于-0.5的值。这是因为根据将标签放置在点的上方或下方,美学vjust将具有不同的值。

ggplot(data, aes(x = serial, y = change)) + 
  geom_line() + 
  geom_point(show.legend = FALSE) +
  geom_text(data = subset(data, change > 2.0),
            aes(x = serial, y = change, 
                color = "red", label = serial, vjust = -0.5),
            show.legend = FALSE) + 
  geom_text(data = subset(data, change < -0.5),
            aes(x = serial, y = change, 
                color = "red", label = serial, vjust = 1),
            show.legend = FALSE) + 
  ylab(label="Change") + 
  xlab("Serial")

enter image description here

答案 1 :(得分:1)

@Rui的回答很简洁,也许我会选择。

话虽如此,您可能想要避免在ggplot中进行子集设置,以提高可读性。我建议在绘图之前在数据集中创建一个与这些条件匹配的虚拟变量。因此,按照您的示例,"Condition" > 2.0 & < -0.5 == "YES"。然后为这些值绘制红色点,其中"Condition" == "YES""NO"的不可见点

这也将有助于您对有关标记点的后续评论。