可以强制ggplot提前评估美学吗?

时间:2015-11-24 17:27:22

标签: r ggplot2

ggplot推迟对aes的评估,直到绘制图表为止。如果ggplot在本地环境中用于定义图形,但稍后在全局环境中绘制图形,则为known problem。但即使在全球环境中,如果在aes中使用临时变量,后来更改其值或不再存在,也可能会导致问题。这是一个例子:

df <- data.frame( a  = 1:100,
                  b1 = sin(0.1*(1:100)),
                  b2 = cos(0.1*(1:100)) )

v <- c( "curve 1", "curve 2" )

plt <- ggplot( NULL ) +
  geom_line( data = df,
             size = 1.5,
             aes( x=a, y=b1, colour=v[1] ) ) +
  geom_line( data = df,
             size = 1.5,
             aes( x=a, y=b2, colour=v[2] ) ) +
  theme( legend.title = element_blank(),
         legend.text=element_text(size=30) )

到目前为止plt按预期显示图表。但是如果删除v,则会发生以下错误:

> rm(v)
> plt
Error in eval(expr, envir, enclos) : object 'v' not found
> 

在这种情况下捕获(全球)环境并不起作用。到目前为止我找到的唯一解决方案如下:

library(ggplot2)

df <- data.frame( a  = 1:100,
                  b1 = sin(0.1*(1:100)),
                  b2 = cos(0.1*(1:100)) )

v <- c( "curve 1", "curve 2" )

aes1 <- aes( x=a, y=b1, colour=v[1] )
aes2 <- aes( x=a, y=b2, colour=v[2] )

aes1$colour <- v[1]
aes2$colour <- v[2]

plt <- ggplot( NULL ) +
  geom_line( data=df, size=1.5, aes1 ) +
  geom_line( data=df, size=1.5, aes2 ) +
  theme( legend.title = element_blank(),
         legend.text=element_text(size=30) )

现在几乎所有东西都可以删除:

> rm(v,aes1,aes2,df)
> plt
> 

enter image description here

有没有更优雅的方法来解决这个问题?

0 个答案:

没有答案