【发布时间】:2020-10-05 21:07:18
【问题描述】:
我的示例数据框df如下
df <- data.frame(ID = c(1, 1, 2, 2, 3, 3, 4, 4),
var1 = c('a', 'a', 'a', 'a', 'b', 'b', 'b', 'b'),
var2 = c(2000, 2001, 2000, 2001, 2000, 2001, 2000, 2001),
var3 = c(1:8))
我的目标是使用ggplot2 在折线图中通过var3 绘制var2,但我希望为每个唯一的ID 值单独绘制一个图。我使用了以下代码,效果很好。
lapply(split(df, df$ID), function(x)
{
ggplot(x, aes(var2, var3)) +
geom_line() +
geom_point()
})
接下来,我想将 var3 大于 4 的值的所有点都填充为白色。我尝试了以下代码,但它返回错误“在 if (df$var3 > 4) { : 条件长度 > 1 并且只会使用第一个元素。”
plot_list<- lapply(split(df, df$ID), function(x)
{
ggplot(x, aes(var2, var3)) +
geom_line() +
if(df$var3 > 4) {
geom_point(fill = "white")
} else{
geom_point(fill = "black")
}
})
我在这里做错了什么,有什么方法可以在我的函数中包含条件语句?提前谢谢你。
【问题讨论】:
-
如果您想为每个
ID单独绘制一个图,您是否考虑过facet_*中的任何一个函数? -
顺便说一句:要让
fill参数在此处生效,您需要将shape设置为21 - 25。请参阅cookbook-r.com/Graphs/Shapes_and_line_types -
关于错误,使用
ifelse,向量化:... + geom_line() + geom_point(fill = ifelse(x[["var3"]] > 4, "white", "black"), shape = 21)