What about this solution using format_tick from File Exchange ?:
data=[1 2 3; 1 3 4; 3 1 2]; bar(data) set(gca,'YLim',[0 3]) set(gca,'YTick',[0:0.5:3]) set(gca, 'YTickLabel',num2str(get(gca,'YTick')','%02.1f%%')) set(gca,'Xtick',1:3) format_ticks(gca, {'$\infty$' ; '20 dB'; '15 dB'})

I left xlabel because it interacts with Xtick , but it can probably be easily moved to a lower position.
EDIT: To fix the overlap of Xtick and xlabel , add this to the end of the code:
xlabh = get(gca,'XLabel'); set(xlabh,'Position',get(xlabh,'Position') - [0 .1 0])

source share