A nice way to show if a series of values fall within a certain, per sample in the series variable, range is to make a line plot with a shaded area indicating the range.

Example:

A line plot is easily made in a typical spreadsheet program. Getting the correct region shaded in the plot by combining area and line plots was however much too cumbersome for me. Therefore I had a look if matplotlib also supports area plots and luckily it does: fill_between. The only difficulty I encountered was that matplotlib is mainly intended for making scatter plots, i.e. a data series with meaningful x and y coordinates. A typical spreadsheet line plot however has text labels for all points on the x-axis (as shown in the example). The easiest solution I could come up with was to simply number the samples in the data series as 1, 2, 3 etc. and then change the ticks on the x-axis manually with the xticks function. If there are too many samples in the data series and the x-axis gets too full and labels start to overlap, most spreadsheet programs simply drop some labels. The code below does the same. The code seems a bit long but most lines are actually used for reading in the data from a csv file.

Example:

A line plot is easily made in a typical spreadsheet program. Getting the correct region shaded in the plot by combining area and line plots was however much too cumbersome for me. Therefore I had a look if matplotlib also supports area plots and luckily it does: fill_between. The only difficulty I encountered was that matplotlib is mainly intended for making scatter plots, i.e. a data series with meaningful x and y coordinates. A typical spreadsheet line plot however has text labels for all points on the x-axis (as shown in the example). The easiest solution I could come up with was to simply number the samples in the data series as 1, 2, 3 etc. and then change the ticks on the x-axis manually with the xticks function. If there are too many samples in the data series and the x-axis gets too full and labels start to overlap, most spreadsheet programs simply drop some labels. The code below does the same. The code seems a bit long but most lines are actually used for reading in the data from a csv file.

import csv #!/usr/bin/env python import csv from pylab import * violet=(90.0/255.0,36.0/255.0,90.0/255.0) red=(1.0,0.0,0.0) green=(0.0,1.0,0.0) def plotFancy(fn, label,figNum=None,ymin=0.0,ymax=500.0,maxticks=20): """ plots directly from a csv file (with a header row!!) file layout: column 1: strip name 2: Exp 3: Mod 4: min 5: max use label to name y-axis if figNum is supplied the grap will be plotted in the figure with that number (and cleared first) ymin and ymax determine the scale on the y-axis (i.e. ylim(ymin,ymax)) maxticks gives the maximum number of ticks (labels) allowed on the x axis """ f=open(fn,'rb') reader=csv.reader(f,delimiter=';') xlabel_lst=[] y_min_lst=[] y_max_lst=[] y_mod_lst=[] y_exp_lst=[] line_cnt=0 for line_lst in reader: line_cnt+=1 if(line_cnt==1): continue xlabel_lst.append(line_lst[0]) y_exp_lst.append(float(line_lst[1])) y_mod_lst.append(float(line_lst[2])) y_min_lst.append(float(line_lst[3])) y_max_lst.append(float(line_lst[4])) cnt_lst= [i for i in range(len(y_mod_lst))] f.close() if(figNum==None): figure() else: figure(figNum) clf() fill_between(cnt_lst,y_min_lst,y_max_lst,facecolor=green,alpha=1.0) plot(cnt_lst,y_mod_lst,'bo',color=violet,label="%s mod"%(label),ms=12) plot(cnt_lst,y_exp_lst,'mv',color=red,label="%s exp"%(label),ms=12) ylim(ymin,ymax) ylabel("%s"%(label)) grid(b=True) legend(loc=9) show() if(len(xlabel_lst)>maxticks): delta=len(xlabel_lst)/float(maxticks-1.0) tick_num_lst=[] tick_text_lst=[] index=0 for i in range(maxticks-1): index=int(i*delta) tick_num_lst.append(index) tick_text_lst.append(xlabel_lst[index]) tick_num_lst.append(len(xlabel_lst)-1) tick_text_lst.append(xlabel_lst[len(xlabel_lst)-1]) xticks(tick_num_lst,tick_text_lst,rotation=90) else: xticks(arange(len(xlabel_lst)),xlabel_lst,rotation=90) xlim(0,len(xlabel_lst))

## No comments:

## Post a Comment