首页 > 解决方案 > 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折线var3ggplot2,​​但我希望每个唯一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")
    }
})

我在这里做错了什么,有什么方法可以在我的函数中包含条件语句?先感谢您。

标签: rfunctionggplot2lapply

解决方案


试试这个方法。将颜色存储在新变量中,启用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()
})

输出:

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

或者您可以更实用和使用fillshape=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')

输出:

在此处输入图像描述


推荐阅读