r - R中lapply()内函数中的条件图形
问题描述
我的示例数据框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))
我的目标是使用 绘制var2
折线var3
图ggplot2
,但我希望每个唯一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")
}
})
我在这里做错了什么,有什么方法可以在我的函数中包含条件语句?先感谢您。
解决方案
试试这个方法。将颜色存储在新变量中,启用color
选项aes()
,然后使用scale_color_identity()
:
library(ggplot2)
#Data
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))
#Create color var
df$Color <- ifelse(df$var3>4,'white','black')
#Plot
lapply(split(df, df$ID), function(x)
{
ggplot(x, aes(x=var2,y=var3,color=Color)) +
geom_line(color='black') +
geom_point()+
scale_color_identity()
})
输出:
或者您可以更实用和使用fill
,shape=21
正如@markus所提到的:
#Plot 2
lapply(split(df, df$ID), function(x)
{
ggplot(x, aes(x=var2,y=var3,fill=Color)) +
geom_line(color='black') +
geom_point(shape=21)+
scale_fill_identity()
})
输出:
或者像@r2evans一样更高级,并避免使用方面的凌乱 lapply:
#Plot 3
ggplot(df, aes(x=var2,y=var3,fill=Color)) +
geom_line(color='black') +
geom_point(shape=21)+
scale_fill_identity()+
facet_wrap(.~ID,scales = 'free')
输出:
推荐阅读
- python - matplotlib中的逗号是什么意思?- Python
- javascript - NodeJS 等待优先级 - 一个等待以错误的顺序在另一个之前运行(Express、SQLite3 db.all 和 db.run)
- zurb-foundation - JOINTSWP 如何在 JOINTWSP 中开启基础原型断点
- python-3.x - 如何将此 24615478158188 uid 代码转换为来自 ESP-RFID 的 f69a4e9e uid 代码?
- bash - Bash脚本将管道sed的输出保存到变量
- express - Express Handlebars - 向不同页面添加独特的样式表和脚本
- c# - 将 HashSet 列表高效转换为单个 HashSet
- reactjs - 有谁知道如何在 React Native 中制作这样的布局?
- regex - 使用 str_match_all 匹配 R 中字符的开头和结尾
- tensorflow - 用例:在 tf serving 中为多个模型提供服务:对于托管的每个模型,我需要在 client.py 文件中进行哪些更改?