您如何有效地为R中的图表(例如,箱图)分配数据?

时间:2016-04-06 23:14:02

标签: r boxplot

我对这个问题进行了相当多的研究并且如果我错过了答案而道歉,但我似乎无法找到特定于我的情景的答案。我想创建2个图表(对于每个级别的帐户:Dr和Cr),其中6个框图基于三列中的数据。数据类似于以下数据(假设有六个日期; 01/01 / 2016-06 / 01/2016):

 Date         Days     Acct
 01/01/16     7        Cr  
 01/01/16     5        Dr  
 02/01/16     6        Cr 
 01/01/16     4        Dr
 02/01/16     6        Dr

让我们假设只有6个唯一的日期值和两个帐户值的1000行--Cr和我将解释我为获取图表所做的工作,但我知道它不是最有效的方式,因为我现在正在使用for循环。

我将Cr数据分配给一个数据帧,然后将Dr数据分配给另一个数据帧。然后,我将每个数据框中的唯一Date值分配给新数据帧。之后,我运行For循环为每个Date值创建一个数据框,并为每个Date值分配Day值,如下所示:

01/01/2016 (Data Frame 1, col A)   
5                                   
7                                   
6

02/01/2016 (Data Frame 2, col A)
3
5

然后我运行一个cbind.fill将所有数据框组合成一个有6列的数据框,其中Date是标题,Days是行中的值。我在该数据框上运行了一个箱线图。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

好的,所以我希望我正确地解释你的问题。你想要两个图表(每个Acct级别1个),每个图表应该有六个箱图(每个日期一个盒子)。由于您的数据集不够大而无法用作示例,因此我创建了自己的数据集,并展示如何使用ggplot2和基础R制作箱图。

library(ggplot2)
set.seed(123)
date_vec = seq(as.Date('2016/1/1'), as.Date('2016/1/6'), by = 'day')
df = data.frame(
  Date = sample(date_vec, 1000, replace = T),
  Days = rpois(1000, lambda = 2),
  Acct = sample(c('Dr','Cr'), 1000, replace = T),
  stringsAsFactors = FALSE
)
        Date Days Acct
1 2016-01-02    1   Dr
2 2016-01-05    2   Dr
3 2016-01-03    1   Dr
4 2016-01-06    3   Cr
5 2016-01-06    3   Dr
6 2016-01-01    2   Cr

您可以ggplot2使用facet_wrapAcct

ggplot(df, aes(x = factor(Date), y = Days))+
  geom_boxplot()+facet_wrap(~Acct)+theme_bw()+
  xlab('Date')

enter image description here

或者,我们可以在基座R中制作两个面板箱图:

par(mfrow = c(1,2)) #plot both simultaneously
with(subset(df, Acct == 'Cr'),
     boxplot(Days~Date, main = 'Cr Boxplots'))
with(subset(df, Acct == 'Dr'),
     boxplot(Days~Date, main = 'Dr Boxplots'))

enter image description here

显然,您需要使用x轴标签来获得更丰富的图表。我希望这会有所帮助。