annotate scripts/score_plot.py @ 1946:1d08f8aee098

Merge WAC paper
author Dave Moffat <me@davemoffat.com>
date Thu, 24 Sep 2015 09:52:08 +0100
parents 4988c805ff9e
children 18dc725bb5c2 1b6fa37d46a4 235594325b84
rev   line source
me@1942 1 #!/usr/bin/python
me@1942 2
me@1942 3 import sys
me@1942 4 import os
me@1942 5 import csv
me@1942 6 import matplotlib.pyplot as plt
me@1942 7 import numpy as np
me@1942 8 import scipy as sp
me@1942 9 import scipy.stats
me@1942 10
me@1942 11 # COMMAND LINE ARGUMENTS
me@1942 12
me@1942 13 #TODO: Merge, implement this functionality
me@1942 14 #TODO: Control by CLI arguments (plot types, save and/or show, ...)
me@1942 15
me@1942 16 assert len(sys.argv)<4, "score_plot takes at most 2 command line arguments\n"+\
me@1942 17 "Use: python score_plot.py [ratings_folder_location]."+\
me@1942 18 "Type 'python score_plot.py -h' for more options"
me@1942 19
me@1942 20 # initialise plot types (false by default) and options
me@1942 21 enable_boxplot = False # show box plot
me@1942 22 enable_confidence = False # show confidence interval
me@1942 23 confidence = 0.90 # confidence value (for confidence interval plot)
me@1942 24 enable_individual = False # show all individual ratings
me@1942 25 show_individual = [] # show specific individuals (empty: show all individuals found)
me@1942 26 show_legend = False # show names of individuals
me@1942 27
me@1942 28 # DEFAULT: Looks in 'saves/ratings/' folder from 'scripts/' folder
me@1942 29 rating_folder = "../saves/ratings/"
me@1942 30
me@1942 31 # XML results files location
me@1942 32 if len(sys.argv) == 1: # no extra arguments
me@1942 33 enable_boxplot = True # show box plot
me@1942 34 print "Use: python score_plot.py [rating folder] [plot_type] [-l/-legend]"
me@1942 35 print "Type 'python score_plot.py -h' for help."
me@1942 36 print "Using default path: " + rating_folder + " with boxplot."
me@1942 37 else:
me@1942 38 for arg in sys.argv: # go over all arguments
me@1942 39 if arg == '-h':
me@1942 40 # show help
me@1942 41 #TODO: replace with contents of helpfile score_plot.info (or similar)
me@1942 42 print "Use: python score_plot.py [rating_folder] [plot_type] [-l] [confidence]"
me@1942 43 print " rating_folder:"
me@1942 44 print " folder where output of 'score_parser' can be found, and"
me@1942 45 print " where plots will be stored."
me@1942 46 print " By default, '../saves/ratings/' is used."
me@1942 47 print ""
me@1942 48 print "PLOT TYPES"
me@1942 49 print " Can be used in combination."
me@1942 50 print " box | boxplot | -b"
me@1942 51 print " Enables the boxplot"
me@1942 52 print " conf | confidence | -c"
me@1942 53 print " Enables the confidence interval plot"
me@1942 54 print " ind | individual | -i"
me@1942 55 print " Enables plot of individual ratings"
me@1942 56 print ""
me@1942 57 print "PLOT OPTIONS"
me@1942 58 print " leg | legend | -l"
me@1942 59 print " For individual plot: show legend with individual file names"
me@1942 60 print " numeric value between 0 and 1, e.g. 0.95"
me@1942 61 print " For confidence interval plot: confidence value"
me@1942 62 assert False, ""# stop immediately after showing help #TODO cleaner way
me@1942 63
me@1942 64 # PLOT TYPES
me@1942 65 elif arg == 'box' or arg == 'boxplot' or arg == '-b':
me@1942 66 enable_boxplot = True # show box plot
me@1942 67 elif arg == 'conf' or arg == 'confidence' or arg == '-c':
me@1942 68 enable_confidence = True # show confidence interval
me@1942 69 #TODO add confidence value input
me@1942 70 elif arg == 'ind' or arg == 'individual' or arg == '-i':
me@1942 71 enable_individual = True # show all individual ratings
me@1942 72
me@1942 73 # PLOT OPTIONS
me@1942 74 elif arg == 'leg' or arg == 'legend' or arg == '-l':
me@1942 75 if not enable_individual:
me@1942 76 print "WARNING: The 'legend' option is only relevant to plots of "+\
me@1942 77 "individual ratings"
me@1942 78 show_legend = True # show all individual ratings
me@1942 79 elif arg.isdigit():
me@1942 80 if not enable_confidence:
me@1942 81 print "WARNING: The numeric confidence value is only relevant when "+\
me@1942 82 "confidence plot is enabled"
me@1942 83 if float(arg)>0 and float(arg)<1:
me@1942 84 confidence = float(arg)
me@1942 85 else:
me@1942 86 print "WARNING: The confidence value needs to be between 0 and 1"
me@1942 87
me@1942 88 # FOLDER NAME
me@1942 89 else:
me@1942 90 # assume it's the folder name
me@1942 91 rating_folder = arg
me@1942 92
me@1942 93 # at least one plot type should be selected: box plot by default
me@1942 94 if not enable_boxplot and not enable_confidence and not enable_individual:
me@1942 95 enable_boxplot = True
me@1942 96
me@1942 97 # check if folder_name exists
me@1942 98 if not os.path.exists(rating_folder):
me@1942 99 #the file is not there
me@1942 100 print "Folder '"+rating_folder+"' does not exist."
me@1942 101 sys.exit() # terminate script execution
me@1942 102 elif not os.access(os.path.dirname(rating_folder), os.W_OK):
me@1942 103 #the file does exist but write rating_folder are not given
me@1942 104 print "No write privileges in folder '"+rating_folder+"'."
me@1942 105
me@1942 106
me@1942 107 # CONFIGURATION
me@1942 108
me@1942 109 # Font settings
me@1942 110 font = {'weight' : 'bold',
me@1942 111 'size' : 10}
me@1942 112 plt.rc('font', **font)
me@1942 113
me@1942 114
me@1942 115 # CODE
me@1942 116
me@1942 117 # get every csv file in folder
me@1942 118 for file in os.listdir(rating_folder): # You have to put this in folder where rating csv files are.
me@1942 119 if file.endswith(".csv"):
me@1942 120 page_name = file[:-4] # file name (without extension) is page ID
me@1942 121
me@1942 122 # get header
me@1942 123 with open(rating_folder+file, 'rb') as readfile: # read this csv file
me@1942 124 filereader = csv.reader(readfile, delimiter=',')
me@1942 125 headerrow = filereader.next() # use headerrow as X-axis
me@1942 126 headerrow = headerrow[1:]
me@1942 127
me@1942 128 # read ratings into matrix
me@1942 129 # ratings = np.loadtxt(open(rating_folder+file,"rb"),
me@1942 130 # delimiter=",",
me@1942 131 # skiprows=1,
me@1942 132 # usecols=range(1,len(headerrow)+1)
me@1942 133 # )
me@1942 134 ratings = np.genfromtxt(readfile,
me@1942 135 delimiter=",",
me@1942 136 #skip_header = 1,
me@1942 137 converters = {3: lambda s: float(s or 'Nan')},
me@1942 138 usecols=range(1,len(headerrow)+1)
me@1942 139 )
me@1942 140
me@1942 141 # assert at least 2 subjects (move on to next file if violated)
me@1942 142 if ratings.shape[0]<2:
me@1942 143 print "WARNING: Just one subject for " + page_name + ". Moving on to next file."
me@1942 144 break
me@1942 145
me@1942 146 # BOXPLOT
me@1942 147 if enable_boxplot:
me@1942 148 plt.boxplot(ratings)
me@1942 149
me@1942 150 # CONFIDENCE INTERVAL
me@1942 151 if enable_confidence:
me@1942 152 iterator = 0
me@1942 153 for column in ratings.T: # iterate over transposed matrix
me@1942 154 # remove all 'Nan's from column
me@1942 155 column = column[~np.isnan(column)]
me@1942 156
me@1942 157 # get number of non-Nan ratings (= #subjects)
me@1942 158 n = column.size
me@1942 159
me@1942 160 # get mean
me@1942 161 mean_rating = np.mean(column)
me@1942 162
me@1942 163 # get errors
me@1942 164 err = scipy.stats.sem(column)* sp.stats.t._ppf((1+confidence)/2., n-1)
me@1942 165
me@1942 166 # draw plot
me@1942 167 plt.errorbar(iterator+1,
me@1942 168 mean_rating,
me@1942 169 yerr=err,
me@1942 170 marker="x",
me@1942 171 color ="k",
me@1942 172 markersize=12,
me@1942 173 linestyle='None')
me@1942 174
me@1942 175 iterator += 1 # increase counter
me@1942 176
me@1942 177
me@1942 178 # INDIVIDUAL PLOT
me@1942 179 if enable_individual or show_individual:
me@1942 180 # marker list and color map to cycle through
me@1942 181 markerlist = ["x", ".", "o", "*", "+", "v", ">", "<", "8", "s", "p"]
me@1942 182 colormap = ['b', 'r', 'g', 'c', 'm', 'y', 'k']
me@1942 183 increment = 0
me@1942 184 linehandles = []
me@1942 185 legendnames = []
me@1942 186 with open(rating_folder+file, 'rb') as readfile: # read this csv file
me@1942 187 filereader = csv.reader(readfile, delimiter=',')
me@1942 188 headerrow = filereader.next() # use headerrow as X-axis
me@1942 189 headerrow = headerrow[1:]
me@1942 190 for row in filereader:
me@1942 191 subject_id = row[0][:-4] # read from beginning of line
me@1942 192 # assume plotting all individuals if no individual(s) specified
me@1942 193 if not show_individual or subject_id in show_individual:
me@1942 194 plothandle, = plt.plot(range(1,len(row)), # x-values
me@1942 195 ratings[increment,:],#row[1:], # y-values: csv values except subject name
me@1942 196 color=colormap[increment%len(colormap)],
me@1942 197 marker=markerlist[increment%len(markerlist)],
me@1942 198 markersize=10,
me@1942 199 linestyle='None',
me@1942 200 label=subject_id
me@1942 201 )
me@1942 202 linehandles.append(plothandle)
me@1942 203 legendnames.append(subject_id)
me@1942 204 if show_legend:
me@1942 205 plt.legend(linehandles, legendnames,
me@1942 206 loc='upper right',
me@1942 207 bbox_to_anchor=(1.1, 1),
me@1942 208 borderaxespad=0.,
me@1942 209 numpoints=1 # remove extra marker
me@1942 210 )
me@1942 211 increment += 1 # increase counter
me@1942 212
me@1942 213 # TITLE, AXIS LABELS AND LIMITS
me@1942 214 plt.title(page_name)
me@1942 215 plt.xlabel('Fragment')
me@1942 216 plt.xlim(0, len(headerrow)+1) # only show relevant region, leave space left & right)
me@1942 217 plt.xticks(range(1, len(headerrow)+1), headerrow, rotation=90) # show fragment names
me@1942 218 plt.ylabel('Rating')
me@1942 219 plt.ylim(0,1)
me@1942 220
me@1942 221
me@1942 222
me@1942 223 # SHOW PLOT
me@1942 224 #plt.show()
me@1942 225 #exit()
me@1942 226
me@1942 227 # SAVE PLOT
me@1942 228 # automatically
me@1942 229 plot_type = ("-box" if enable_boxplot else "") + \
me@1942 230 ("-conf" if enable_confidence else "") + \
me@1942 231 ("-ind" if enable_individual else "")
me@1942 232 plt.savefig(rating_folder+page_name+plot_type+".pdf", bbox_inches='tight')
me@1942 233 plt.close()