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); |
---|