| 1 | #!/usr/bin/perl -w |
|---|
| 2 | |
|---|
| 3 | # This program draws, in a pdf file, a stacked bars plot for different categories of data and for |
|---|
| 4 | # different criteria. For each criterion a stacked bar is drawn, such that the height of each stacked |
|---|
| 5 | # sub-bar represents the number of elements in each category satisfying that criterion. |
|---|
| 6 | # The input consists of a TABULAR format file, where the left column represents the names of categories |
|---|
| 7 | # and the other columns are headed by the names of criteria, such that each data value in the file |
|---|
| 8 | # represents the number of elements in a certain category satisfying a certain criterion. |
|---|
| 9 | # The output is a PDF file containing a stacked bars plot representing the number of elements in each |
|---|
| 10 | # category satisfying each criterion. The drawing is done using R code. |
|---|
| 11 | |
|---|
| 12 | |
|---|
| 13 | use strict; |
|---|
| 14 | use warnings; |
|---|
| 15 | |
|---|
| 16 | my $criterion; |
|---|
| 17 | my @criteriaArray = (); |
|---|
| 18 | my $criteriaNumber = 0; |
|---|
| 19 | my $lineCounter = 0; |
|---|
| 20 | |
|---|
| 21 | #variable to store the names of R script file |
|---|
| 22 | my $r_script; |
|---|
| 23 | |
|---|
| 24 | # check to make sure having correct files |
|---|
| 25 | my $usage = "usage: draw_stacked_bar_plot.pl [TABULAR.in] [PDF.out] \n"; |
|---|
| 26 | die $usage unless @ARGV == 2; |
|---|
| 27 | |
|---|
| 28 | my $categoriesInputFile = $ARGV[0]; |
|---|
| 29 | |
|---|
| 30 | my $categories_criteria_bars_plot_outputFile = $ARGV[1]; |
|---|
| 31 | |
|---|
| 32 | #open the input file |
|---|
| 33 | open (INPUT, "<", $categoriesInputFile) || die("Could not open file $categoriesInputFile \n"); |
|---|
| 34 | open (OUTPUT, ">", $categories_criteria_bars_plot_outputFile) || die("Could not open file $categories_criteria_bars_plot_outputFile \n"); |
|---|
| 35 | |
|---|
| 36 | # R script to implement the drawing of a stacked bar plot representing thes significant motifs in each category of motifs |
|---|
| 37 | #construct an R script file |
|---|
| 38 | $r_script = "motif_significance_bar_plot.r"; |
|---|
| 39 | open(Rcmd,">", $r_script) or die "Cannot open $r_script \n\n"; |
|---|
| 40 | print Rcmd " |
|---|
| 41 | #store the table content of the first file into a matrix |
|---|
| 42 | categoriesTable <- read.table(\"$categoriesInputFile\", header = TRUE); |
|---|
| 43 | categoriesMatrix <- as.matrix(categoriesTable); |
|---|
| 44 | |
|---|
| 45 | |
|---|
| 46 | #compute the sum of elements in the column with the maximum sum in each matrix |
|---|
| 47 | columnSumsVector <- colSums(categoriesMatrix); |
|---|
| 48 | maxColumn <- max (columnSumsVector); |
|---|
| 49 | |
|---|
| 50 | if (maxColumn %% 10 != 0){ |
|---|
| 51 | maxColumn <- maxColumn + 10; |
|---|
| 52 | } |
|---|
| 53 | |
|---|
| 54 | plotHeight = maxColumn/8; |
|---|
| 55 | criteriaVector <- names(categoriesTable); |
|---|
| 56 | |
|---|
| 57 | pdf(file = \"$categories_criteria_bars_plot_outputFile\", width = length(criteriaVector), height = plotHeight, family = \"Times\", pointsize = 12, onefile = TRUE); |
|---|
| 58 | |
|---|
| 59 | |
|---|
| 60 | |
|---|
| 61 | #draw the first barplot |
|---|
| 62 | barplot(categoriesMatrix, ylab = \"No. of elements in each category\", xlab = \"Criteria\", ylim = range(0, maxColumn), col = \"black\", density = c(10, 20, 30, 40, 50, 60, 70, 80), angle = c(45, 90, 135), names.arg = criteriaVector); |
|---|
| 63 | |
|---|
| 64 | #draw the legend |
|---|
| 65 | legendX = 0.2; |
|---|
| 66 | legendY = maxColumn; |
|---|
| 67 | |
|---|
| 68 | legend (legendX, legendY, legend = rownames(categoriesMatrix), density = c(10, 20, 30, 40, 50, 60, 70, 80), angle = c(45, 90, 135)); |
|---|
| 69 | |
|---|
| 70 | dev.off(); |
|---|
| 71 | |
|---|
| 72 | #eof\n"; |
|---|
| 73 | close Rcmd; |
|---|
| 74 | system("R --no-restore --no-save --no-readline < $r_script > $r_script.out"); |
|---|
| 75 | |
|---|
| 76 | #close the input files |
|---|
| 77 | close(OUTPUT); |
|---|
| 78 | close(INPUT); |
|---|