如何让facet_grid知道其他数据框?

时间:2013-10-15 07:57:59

标签: r ggplot2

我有以下数据帧,其中包含不同算法的预测结果,即dummy和xxx_simple以及重复的测试数据。除了误差测量之外,该想法是输出每个算法的预测准确度的比较图。对每种算法重复(真实)测试数据。我使用ggplot2 facet_grid按组绘制此数据框。

> df_all
      t    value      label      group
1  2246 869.3300       test      dummy
2  2247 873.7100       test      dummy
3  2248 870.2100       test      dummy
4  2249 866.3900       test      dummy
5  2250 850.1500       test      dummy
6  2246 865.4200      dummy      dummy
7  2247 869.3300      dummy      dummy
8  2248 873.7100      dummy      dummy
9  2249 870.2100      dummy      dummy
10 2250 866.3900      dummy      dummy
11 2246 869.3300       test xxx_simple
12 2247 873.7100       test xxx_simple
13 2248 870.2100       test xxx_simple
14 2249 866.3900       test xxx_simple
15 2250 850.1500       test xxx_simple
16 2246 855.9046 xxx_simple xxx_simple
17 2247 858.6711 xxx_simple xxx_simple
18 2248 864.8865 xxx_simple xxx_simple
19 2249 863.0154 xxx_simple xxx_simple
20 2250 860.8577 xxx_simple xxx_simple

我将其绘制如下:

ggplot(df_all, mapping=aes(x=t, y=value, color=label, shape=label)) +  
   geom_point() + ggtitle('Test vs. Predicted') + geom_line() + 
       facet_grid(. ~ group) 

现在我想要包含错误段,突出显示预测值与每个点的测试数据的距离。我按以下方式计算一个算法的df_error

df_error <- data.frame(x=t, xend=t, y=df_test$value, yend=df_predicted$value, type=as.factor('error'), group=as.factor(output_label))

结果df_error_all是:

> df_error_all
      x xend      y     yend  type      group
1  2246 2246 869.33 865.4200 error      dummy
2  2247 2247 873.71 869.3300 error      dummy
3  2248 2248 870.21 873.7100 error      dummy
4  2249 2249 866.39 870.2100 error      dummy
5  2250 2250 850.15 866.3900 error      dummy
6  2246 2246 869.33 855.9046 error xxx_simple
7  2247 2247 873.71 858.6711 error xxx_simple
8  2248 2248 870.21 864.8865 error xxx_simple
9  2249 2249 866.39 863.0154 error xxx_simple
10 2250 2250 850.15 860.8577 error xxx_simple

尝试将细分数据合并到facet_grid图中:

ggplot(df_all, mapping=aes(x=t, y=value, color=label, shape=label)) +  
   geom_point() + ggtitle('Test vs. Predicted') + geom_line() + facet_grid(. ~ group) +
     geom_segment(data=df_error_all, aes(x=df_error_all$x,y=df_error_all$y,xend=df_error_all$xend,yend=df_error_all$yend), size=0.3)

产生以下错误:

Error in data.frame(x = c(2246L, 2247L, 2248L, 2249L, 2250L, 2246L, 2247L,  : 
   arguments imply differing number of rows: 10, 0

此错误表明facet_grid无法识别相同的分组条件适用于df_error_all段数据。另请注意,df_error_all具有不同的结构,无法与df_all数据框结合使用。

1 个答案:

答案 0 :(得分:4)

如果我使用您在问题中提供的数据,但我没有收到有关不同行数的错误消息,但还有其他错误消息:

Error in eval(expr, envir, enclos) : object 'label' not found

此错误消息是由于您在color=label来电中提供shape=labelggplot()的方面,但数据框df_error_all没有此列。因此,您需要在inherit.aes=FALSE电话中添加geom_segment()以忽略这些美学。

ggplot(df_all, mapping=aes(x=t, y=value, color=label, shape=label)) +  
  geom_point() + ggtitle('Test vs. Predicted') + geom_line() + facet_grid(. ~ group) +
  geom_segment(data=df_error_all, aes(x=x,y=y,xend=xend,yend=yend), 
                                size=0.3,inherit.aes=FALSE)