% File -> Import Data (gas_all_grades.csv) % Number of header rows = 1 % constants to determine how data is filtered FILTER_CITY = 1; FILTER_STATE = 2; FILTER_REGION = 3; FILTER_COUNTRY = 4; FILTER_ALL = 5; % filter data using ... filterData = FILTER_STATE; % format numbers with at most 5 digits after decimal format short g % sort data and return index of sort [dataSorted,sortIndex] = sortrows(data,[5 1 4]); % first row of textdata is garbage textdata2 = textdata(2:size(textdata,1),:); % apply sort index to textdata textdataSorted = textdata2(sortIndex,:); % read geography info into vectors, which will act as lookup tables % read from file 'geography.csv' % read each line as '%q %q' = [string string] % read all lines (= -1) % as the 'delimiter', use a comma (',') [geoCode,geoName] = textread('geography.csv', '%q %q', -1, 'delimiter', ','); % first lines of each read column are garbage geoCode = geoCode(2:length(geoCode)); geoName = geoName(2:length(geoName)); % extract data by iterating over every region code and extracting data for % that region dataByGeo = []; dataByGeoEndIndex = []; % text is represented in cells textdataByGeo = cell(0); textdataByGeoEndIndex = []; for i=1:length(geoCode) % for any given string, the function 'letters' returns an array where % for each character of the string, a 1 denotes that the character is a % letter, and a 0 denotes that it is not. % Example: letters('Zoo100') = [1 1 1 0 0 0] % data type 'cell' is converted to 'char' using function 'char' letters = isletter(char(geoCode(i))); % filter: city=2nd letter of code is digit, e.g. N1=New York City if ((filterData == FILTER_CITY) && (letters(2) == 1)) dataT=[]; textdataT=[]; % filter: region=1st letter of code is digit, e.g. 1A=New England Region elseif ((filterData == FILTER_REGION) && (letters(1) == 1)) dataT = []; textdataT = []; % filter: only country considered: US elseif ((filterData == FILTER_COUNTRY) && (strcmp(geoCode(i), 'US') == 0)) dataT = []; textdataT = []; % filter: both letters elseif ((filterData == FILTER_STATE) && ((sum(letters) ~= 2) || (strcmp(geoCode(i), 'US') == 1))) dataT = []; textdataT = []; else [dataT, textdataT] = extractRegion(dataSorted, textdataSorted, geoCode(i)); end % collect extracted data and textdata per geographical area in a matrix dataByGeo(1:size(dataT,1), 1:size(dataT,2), i) = dataT; dataByGeoEndIndex(i,:) = size(dataT); textdataByGeo(1:size(textdataT,1), 1:size(textdataT,2), i) = textdataT; textdataByGeoEndIndex(i,:) = size(textdataT); end % find minimum year to offset each data set yearMin = min(data(:,5)); % make an empty plot with titles and labels plot([], []), xlabel('Time'), ylabel('Price in cents/gallon'), title('Gasoline prices in various regions in U.S.'); % used to overlay next plots hold on; % line colors used colors = {'b','g','r','c','m'}; ci = 1; % line marks used marks = {'o','x','+','*','d'}; mi = 1; % collect legend labels to create legend after plotting labels = cell(0); li = 1; % iterate over all geographical regions and make plot for i = 1:length(geoCode) % since data is irregularly sized and data is located in 3D matrix % structure, ei denotes the "real" length of each data slice ei = dataByGeoEndIndex(i,1); % if data has been collected, length is greater than 0, so plot it if (ei > 0) % create timeline timeT = ((dataByGeo(1:ei, 5, i) - yearMin) * 52) + (dataByGeo(1:ei, 1, i) * 4) + dataByGeo(1:ei, 4, i); % plot data plot(timeT, dataByGeo(1:ei, 2, i), [char(colors(ci)) char(marks(mi)) '-']); % collect label labels(li) = geoName(indexOf(geoCode, geoCode(i))); li = li + 1; % rotate colors and marks if (mod(ci, length(colors)) == 0) ci = 1; mi = mi + 1; else ci = ci + 1; end end end % stop overlaying graphs hold off; % create legend legend(labels, 'Location', 'BestOutside');