让我们假设这个数据集
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")
现在,我要标记(大于红色的圆圈或序列号)高于2.0且低于-0.5的每个数据点。
任何想法该怎么做?
答案 0 :(得分:2)
您可以在对geom_point
的调用中重新定义数据集。然后使用x
和y
的新值来仅绘制那些点。
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")
要绘制数字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")
答案 1 :(得分:1)
@Rui的回答很简洁,也许我会选择。
话虽如此,您可能想要避免在ggplot中进行子集设置,以提高可读性。我建议在绘图之前在数据集中创建一个与这些条件匹配的虚拟变量。因此,按照您的示例,"Condition" > 2.0 & < -0.5 == "YES"
。然后为这些值绘制红色点,其中"Condition" == "YES"
和"NO"
的不可见点
这也将有助于您对有关标记点的后续评论。