【问题标题】:Conditional graphing in a function within lapply() in RR中lapply()内函数中的条件图形
【发布时间】: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"]] &gt; 4, "white", "black"), shape = 21)

标签: r function ggplot2 lapply


【解决方案1】:

试试这个方法。将颜色存储在新变量中,启用aes() 中的color 选项,然后使用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 那样更高级,并避免使用 facets 的凌乱的 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')

输出:

【讨论】:

  • 这很好用,谢谢大家。我特别需要单独保存每个图,这就是我使用lapply() 而不是facet_wrap() 的原因。我还没用过scale_xx()系列,以后会很有用的。
猜你喜欢
  • 2021-04-22
  • 1970-01-01
  • 2015-04-10
  • 2021-09-03
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-01
相关资源
最近更新 更多