如何通过var和bin为R boxplot准备数据对象?

时间:2017-11-06 18:05:46

标签: r boxplot

我想绘制一组箱图,如下图所示:clears the float

数据生成

#plot boxplots by variable and set
bp = boxplot(
  val ~ (var * set), 
  bp_data,
  col = bp_data$var,
  xaxt = "n"  
)

# add axis labels and legend
axis(1, at = seq(1.5,7.5,2), labels = paste("set", c(1:4)), tick=FALSE , cex.axis=1.2)
legend("topright", c("var 1", "var 2"), col=c("red", "green"),pch =15)

绘图命令

boxplot()

我对使用样本数据集生成的绘图非常满意。在此示例数据中,您可以看到,所有分布的n都为100.

但是,当我切换到实际数据时,我的向量当然不具有长度100,因此,我无法为boxplot()提供包含val的矩阵。我不知道,如何调整给bp_data = list( set = c(1,1,2,2,3,3,4,4), var = rep(c("red", "green"), 4), val = list( a = runif(100, 1, 10), b = runif(100, 1, 12), c = runif(100, 1, 13), d = runif(100, 1, 14), e = runif(100, 1, 15), f = runif(100, 1, 16), g = runif(100, 1, 17), h = runif(100, 1, 18) ) ) 的公式来创建具有真实数据的图。

我尝试使用以下内容准备我的数据:

set

将值存储为列表,可能会使各个向量的长度不同。但是boxplot不接受它当前的形式。

真实数据

在我使用我的真实数据之前,我想让图表正常工作,以便相应地生成我的数据。但要解释一下,这就是我获取数据的方式。我按集(var)迭代一个对象。对于每个集合,我计算变量,为此我将为每个变量(val)创建一个名称,然后计算值(var)。因此,对于每次迭代,我将生成set长度为1的字符串,迭代的melt()字符串和长度为80-100的值。

也许我可以更好地准备数据并使用reshape2的bp_data = data.frame(set = character(0), var = character(0), val = numeric(0)) for(set in names(data.obj)){ # store slope bp_data = rbind(bp_data, data.frame( set = survey, var = "slope", val = data.obj[[set]]$height / data.obj[[set]]$length )) # store whatever bp_data = rbind(bp_data, data.frame( set = survey, var = "whatever", val = data.obj[[set]]$var1 / data.obj[[set]]$var2 + data.obj[[set]]$var3 )) } 做一些事情?我没有经验......

建议

这是解决问题的好方法吗?

 var targetEle = element(by.xpath(/html/body/app-root/div/app-dashboard/div/div/div[1]/div[3]/div/div[1]/h5'));
    var EC_TIMEOUT = 5000;
    browser.wait(EC.visibilityOf(targetEle), EC_TIMEOUT).then(function(){
        browser.wait(EC.elementToBeClickable(targetEle), EC_TIMEOUT).then(function(){
            //callback();
            targetEle.click().then(function() {
                callback();
            });
        });
    });

1 个答案:

答案 0 :(得分:0)

boxplot不需要矩阵,也不需要相同长度的列表。 下面,我修改了您的数据生成步骤,使每个列表具有不同的长度。然后,只需要对代码进行细微更改。

## Modified data
bp_data = list(
  set = c(1,1,2,2,3,3,4,4),
  var = rep(c("red", "green"), 4),
  val = list(
    a = runif(70, 1, 10),
    b = runif(75, 1, 12),
    c = runif(80, 1, 13), 
    d = runif(85, 1, 14),
    e = runif(90, 1, 15),
    f = runif(95, 1, 16),
    g = runif(100, 1, 17),
    h = runif(105, 1, 18)
  )    
)

## Modified code
bp = boxplot(
  bp_data$val, 
  col= bp_data$var,
  xaxt = "n"
)
axis(1, at = seq(1.5,7.5,2), labels = paste("set", c(1:4)), tick=FALSE , cex.axis=1.2)
legend("topleft", c("var 1", "var 2"), col=c("red", "green"),pch =15)

Barplot