Matlab App Designer Bar Graph
Bar charts are a great way to visualize data. Matlab includes the bar function that enables displaying 2D bars in several different manners, stacked or grouped (there's also bar3 for 3D bar-charts, and barh, bar3h for the corresponding horizontal bar charts).
Displaying stacked 1D data
bar is basically a high-level m-file wrapper for the low-level specgraph.barseries object. Such wrappers are generally a good thing, assigning default property values, checking the input data for illegal values etc. But in some cases, they are simply too smart. One such case happened to me a few days ago, when I needed to display a stacked chart of some data values. This works great when the data is a 2D matrix, but when the data happens to be 1D (a single row), bar decides to display the values in separate bars (left screenshot), rather than in a single stacked bar (right screenshot), even when I specifically ask for a 'stacked' graph:
Default bar plot of 1D data
Bar plot of 1D data - stacked
I could of course revert to the lower-level specgraph.barseries . But in this case the simple workaround was to add a dummy data row of Nan
values, tricking bar into thinking it's a 2D data. Since Nan
values are never plotted in Matlab, we get the requested stacked bar, alongside an empty bar next to it. All we need to do now is to delete the extra tick-label for the dummy (empty) bar and we're done:
bar ( [ 6,4,1; nan ( 1,3 ) ], 'Stacked' ); set ( gca,'xtick',1 )
or, more generally (taking care of both 2D and 1D data):
bar ( [data; nan ( size (data) ) ],'Stacked' ); set ( gca, 'xtick',1:size (data,1 ) );
Displaying data labels
One of the features that I miss most in Matlab bar-charts is the ability to easily add data labels next to the colored patches. This can be added programmatically as I'll just show, but it would be much better if there were properties that controlled this. Here's my implementation:
First, let's display a simple stacked bar chart:
data = [ 6,4,1; 5,2,2; 4,0,0; 2,0,1; 0,2,0; 0,1,1 ]; hDataSeries = bar (data,'stacked' ); set ( gca, 'xlim',[ 0,7 ], 'box','off' );
Default bar plot of 2D data
Now let's add the bar totals on top of the bars:
sumTotals = sum (data,2 ); sumTotals = sumTotals(~isnan (sumTotals) ); labels = arrayfun( @ num2str,sumTotals,'uniform',false ); hText = text( 1:size (data,1 ), sumTotals, labels); set (hText, 'VerticalAlignment','bottom', 'FontSize',8, 'Color','b' );
Bar plot with totals
Now let's add the individual data-series labels, but only next to bars that have 2 or more components (if a bar only has a single patch component, then the top label is enough and there is no need for it to also appear on the side):
hPatches = get (hDataSeries,'Children' ); try hPatches = cell2mat(hPatches); catch, end % no need in case of single patch xData = get (hPatches( 1 ),'XData' ); xPos = xData( end,:) + 0.01; yData = get (hPatches,'YData' ); try yData = cell2mat(yData); catch, end barYs = yData( 2:4:end,:); barValues = diff ( [ zeros ( 1,size (barYs,2 ) ); barYs] ); barValues(bsxfun( @minus,barValues,sum (barValues) )==0 ) = 0; % no sub-total for bars having only a single sub-total yPos = yData( 1:4:end,:) + barValues/2; xPos = xPos( ones ( 1,size (yPos,1 ) ),:); xPos(barValues==0 ) = [ ]; % remove entries for empty bars patches yPos(barValues==0 ) = [ ]; % remove entries for empty bars patches barValues(barValues==0 ) = [ ]; % remove entries for empty bars patches labels = strcat ( ' ', arrayfun( @ num2str,barValues(:),'uniform',false ) ); hText = text(xPos(:), yPos(:), labels); set (hText, 'FontSize',8 );
Finally, add the legend and we're done:
hLegend = legend (hDataSeries, { 'Blue','Green','Red' } ); set (hLegend, 'FontSize',8 );
Bar plot with sub-totals & legend
Additional customization of the bar patches can be made using the patch handles, which are included as children of the returned hDataSeries
handles:
hDataSeries = bar ( ... ); hPatches = get (hDataSeries, 'Children' ); try hPatches = cell2mat(hPatches); catch, end % no need in case of single patch
Note: hDataSeries
is an array of handles, one per data column. Each handle is an hggroup of patches. As with all patches, we can customize their face and edge line-style, width, color, transparency, shading/lighting etc.
Matlab App Designer Bar Graph
Source: https://undocumentedmatlab.com/blog_old/bar-plot-customizations
Posted by: sanchezprofter.blogspot.com
0 Response to "Matlab App Designer Bar Graph"
Post a Comment