
----

## <a name="bz"></a> Bugzilla

### <a name="bz_issues"></a> Bugzilla issues

**Download**: [`r file_bz_issues`.gz](https://download.eclipse.org/dataeggs/projects/`r project_id`/`r file_bz_issues`.gz)

```{r bz_issues}
data <- read.csv(file=file_bz_issues, header=T)
```

File is [``r file_bz_issues``](https://download.eclipse.org/dataeggs/projects/`r project_id`/`r file_bz_issues`.gz), and has ``r ncol(data)`` columns for ``r nrow(data)`` issues.


### <a name="bz_issues_open"></a> Bugzilla open issues

**Download**: [`r file_bz_issues_open`.gz](https://download.eclipse.org/dataeggs/projects/`r project_id`/`r file_bz_issues_open`.gz)

```{r bz_issues_open}
data <- read.csv(file=file_bz_issues_open, header=T)
```

File is [``r file_bz_issues_open``](https://download.eclipse.org/dataeggs/projects/`r project_id`/`r file_bz_issues_open`.gz), and has ``r ncol(data)`` columns for ``r nrow(data)`` issues (all open).


### <a name="bz_evol"></a> Bugzilla evolution

**Download**: [`r file_bz_evol`.gz](https://download.eclipse.org/dataeggs/projects/`r project_id`/`r file_bz_evol`.gz)

```{r bz_evol}
data <- read.csv(file=file_bz_evol, header=T)
```

File is [``r file_bz_evol``](https://download.eclipse.org/dataeggs/projects/`r project_id`/`r file_bz_evol`.gz), and has ``r ncol(data)`` columns for ``r nrow(data)`` weeks. 

Let's try to plot the monthly number of submissions for the project:

```{r bz_evol_viz, echo=FALSE}
data.xts <- xts(x = data, order.by = as.POSIXct(data$date))

time.min <- index(data.xts[1,])
time.max <- index(data.xts[nrow(data.xts)])
all.dates <- seq(time.min, time.max, by="days")
empty <- xts(order.by = all.dates)

merged.data <- merge(empty, data.xts$issues_created, all=T)
merged.data[is.na(merged.data) == T] <- 0

data.monthly <- apply.monthly(x=merged.data, FUN = sum)

p <-dygraph(data.monthly[-1,1],
        main = paste('Monthly issues submissions for ', project_id, sep=''),
        width = "750px", height = 250 ) %>%
      dyRangeSelector()
p
```


### Versions

**Download**: [`r file_bz_versions`.gz](https://download.eclipse.org/dataeggs/projects/`r project_id`/`r file_bz_versions`.gz)

```{r bz_versions}
data <- read.csv(file=file_bz_versions, header=T)
```

File is [``r file_bz_versions``](https://download.eclipse.org/dataeggs/projects/`r project_id`/`r file_bz_versions`.gz), and has ``r ncol(data)`` columns for ``r nrow(data)`` weeks.

```{r bz_versions_viz, echo=FALSE, message=FALSE, results='asis'}
suppressPackageStartupMessages(library(googleVis))
options(gvis.plot.tag='chart')

data.sorted <- data[order(data$Bugs, decreasing = T),]

g <- gvisColumnChart(data.sorted, options=list(title='List of product versions', legend="{position: 'none'}", width="automatic", height="300px"))
plot(g)
```


### Components

**Download**: [`r file_bz_components`.gz](https://download.eclipse.org/dataeggs/projects/`r project_id`/`r file_bz_components`.gz)

```{r bz_components}
data <- read.csv(file=file_bz_components, header=T)
```

File is [``r file_bz_components``](https://download.eclipse.org/dataeggs/projects/`r project_id`/`r file_bz_components`.gz), and has ``r ncol(data)`` columns for ``r nrow(data)`` weeks.

```{r bz_components_viz, echo=T, message=FALSE, results='asis'}
data.sorted <- data[order(data$Bugs, decreasing = T),]

g <- gvisColumnChart(data.sorted, options=list(title='List of product components', legend="{position: 'none'}", width="automatic", height="300px"))
plot(g)
```

