Database tüddelei DBHanlder läuft gut für DIESE Datanbank struktur... App begonnen aber weit entfernt von gutem Stand
2820 lines
96 KiB
Matlab
2820 lines
96 KiB
Matlab
% =========================================================================
|
|
% *** FUNCTION ACID
|
|
% ***
|
|
% *** MATLAB2TikZ ACID test functions
|
|
% ***
|
|
% =========================================================================
|
|
function [status] = ACID(k)
|
|
|
|
% assign the functions to test
|
|
testfunction_handles = { ...
|
|
@multiline_labels , ...
|
|
@plain_cos , ...
|
|
@sine_with_markers , ...
|
|
@markerSizes , ...
|
|
@markerSizes2 , ...
|
|
@sine_with_annotation, ...
|
|
@linesWithOutliers , ...
|
|
@peaks_contour , ...
|
|
@contourPenny , ...
|
|
@peaks_contourf , ...
|
|
@many_random_points , ...
|
|
@double_colorbar , ...
|
|
@randomWithLines , ...
|
|
@double_axes , ...
|
|
@double_axes2 , ...
|
|
@logplot , ...
|
|
@colorbarLogplot , ...
|
|
@legendplot , ...
|
|
@legendplotBoxoff , ...
|
|
@plotyyLegends , ...
|
|
@zoom , ...
|
|
@quiveroverlap , ...
|
|
@quiverplot , ...
|
|
@quiver3plot , ...
|
|
@logicalImage , ...
|
|
@imagescplot , ...
|
|
@imagescplot2 , ...
|
|
@stairsplot , ...
|
|
@polarplot , ...
|
|
@roseplot , ...
|
|
@compassplot , ...
|
|
@stemplot , ...
|
|
@stemplot2 , ...
|
|
@bars , ...
|
|
@xAxisReversed , ...
|
|
@errorBars , ...
|
|
@errorBars2 , ...
|
|
@subplot2x2b , ...
|
|
@manualAlignment , ...
|
|
@subplotCustom , ...
|
|
@legendsubplots , ...
|
|
@bodeplots , ...
|
|
@rlocusPlot , ...
|
|
@mandrillImage , ...
|
|
@besselImage , ...
|
|
@clownImage , ...
|
|
@zplanePlot1 , ...
|
|
@zplanePlot2 , ...
|
|
@freqResponsePlot , ...
|
|
@axesLocation , ...
|
|
@axesColors , ...
|
|
@multipleAxes , ...
|
|
@scatterPlotRandom , ...
|
|
@scatterPlot , ...
|
|
@scatter3Plot , ...
|
|
@spherePlot , ...
|
|
@surfPlot , ...
|
|
@surfPlot2 , ...
|
|
@superkohle , ...
|
|
@meshPlot , ...
|
|
@ylabels , ...
|
|
@spectro , ... % takes pretty long to LuaLaTeX-compile
|
|
@mixedBarLine , ...
|
|
@decayingharmonic , ...
|
|
@texcolor , ...
|
|
@textext , ...
|
|
@texrandom , ...
|
|
@latexInterpreter , ...
|
|
@latexmath2 , ...
|
|
@parameterCurve3d , ...
|
|
@parameterSurf , ...
|
|
@fill3plot , ...
|
|
@rectanglePlot , ...
|
|
@herrorbarPlot , ...
|
|
@hist3d , ...
|
|
@myBoxplot , ...
|
|
@areaPlot , ...
|
|
@customLegend , ...
|
|
@pixelLegend , ...
|
|
@croppedImage , ...
|
|
@pColorPlot , ...
|
|
@hgTransformPlot , ...
|
|
@scatterPlotMarkers , ...
|
|
@multiplePatches , ...
|
|
@logbaseline , ...
|
|
@alphaImage , ...
|
|
@annotationAll , ...
|
|
@annotationSubplots , ...
|
|
@annotationText , ...
|
|
@annotationTextUnits , ...
|
|
@imageOrientation_PNG, ...
|
|
@imageOrientation_inline, ...
|
|
@texInterpreter , ...
|
|
@stackedBarsWithOther, ...
|
|
@colorbarLabelTitle , ...
|
|
@textAlignment , ...
|
|
@overlappingPlots , ...
|
|
@histogramPlot , ...
|
|
@alphaTest , ...
|
|
@removeOutsideMarker , ...
|
|
@colorbars , ...
|
|
@colorbarManualLocationRightOut , ...
|
|
@colorbarManualLocationRightIn , ...
|
|
@colorbarManualLocationLeftOut , ...
|
|
@colorbarManualLocationLeftIn
|
|
};
|
|
|
|
|
|
numFunctions = length( testfunction_handles );
|
|
|
|
if (k<=0)
|
|
status = testfunction_handles;
|
|
return; % This is used for querying numFunctions.
|
|
|
|
elseif (k<=numFunctions)
|
|
status = testfunction_handles{k}();
|
|
status.function = func2str(testfunction_handles{k});
|
|
|
|
else
|
|
error('testfunctions:outOfBounds', ...
|
|
'Out of bounds (number of testfunctions=%d)', numFunctions);
|
|
end
|
|
|
|
end
|
|
% =========================================================================
|
|
function data = ACID_data()
|
|
% Data to be used for various ACID tests
|
|
% This ensures the tests don't rely on functions that yield
|
|
% non-deterministic output, e.g. `rand` and `svd`.
|
|
data = [ 11 11 9
|
|
7 13 11
|
|
14 17 20
|
|
11 13 9
|
|
43 51 69
|
|
38 46 76
|
|
61 132 186
|
|
75 135 180
|
|
38 88 115
|
|
28 36 55
|
|
12 12 14
|
|
18 27 30
|
|
18 19 29
|
|
17 15 18
|
|
19 36 48
|
|
32 47 10
|
|
42 65 92
|
|
57 66 151
|
|
44 55 90
|
|
114 145 257
|
|
35 58 68
|
|
11 12 15
|
|
13 9 15
|
|
10 9 7];
|
|
end
|
|
% =========================================================================
|
|
function [stat] = multiline_labels()
|
|
stat.description = 'Test multiline labels and plot some points.';
|
|
stat.unreliable = isOctave || isMATLAB(); %FIXME: `width` is inconsistent, see #552
|
|
|
|
m = [0 1 1.5 1 -1];
|
|
plot(m,'*-'); hold on;
|
|
plot(m(end:-1:1)-0.5,'x--');
|
|
|
|
title({'multline','title'});
|
|
legend({sprintf('multi-line legends\ndo work 2^2=4'), ...
|
|
sprintf('second\nplot')});
|
|
xlabel(sprintf('one\ntwo\nthree'));
|
|
ylabel({'one','° ∞', 'three'});
|
|
|
|
set(gca,'YTick', []);
|
|
set(gca,'XTickLabel',{});
|
|
end
|
|
% =========================================================================
|
|
function [stat] = plain_cos()
|
|
stat.description = 'Plain cosine function.';
|
|
|
|
t = linspace(0, 2*pi, 1e5);
|
|
x = cos(t);
|
|
|
|
% Explicitely cut the line into segments
|
|
x([2e4, 5e4, 8e4]) = NaN;
|
|
|
|
% Plot the cosine
|
|
plot(t, x);
|
|
xlim([0, 2*pi]);
|
|
|
|
% also add some patches to test their border color reproduction
|
|
hold on;
|
|
h(1) = fill(pi*[1/4 1/4 1/2 1/2] , [-2 1 1 -2], 'y');
|
|
h(2) = fill(pi*[1/4 1/4 1/2 1/2]+pi, -[-2 1 1 -2], 'y');
|
|
|
|
set(h(1), 'EdgeColor', 'none', 'FaceColor', 0.8*[1 1 1]);
|
|
set(h(2), 'EdgeColor', 'k', 'FaceColor', 0.5*[1 1 1]);
|
|
|
|
if isMATLAB
|
|
uistack(h, 'bottom'); % patches below the line plot
|
|
% this is not supported in Octave
|
|
end
|
|
|
|
% add some minor ticks
|
|
set(gca, 'XMinorTick', 'on');
|
|
set(gca, 'YTick', []);
|
|
|
|
% Adjust the aspect ratio when in MATLAB(R) or Octave >= 3.4.
|
|
if isOctave('<=', [3,4])
|
|
% Octave < 3.4 doesn't have daspect unfortunately.
|
|
else
|
|
daspect([ 1 2 1 ])
|
|
end
|
|
end
|
|
% =========================================================================
|
|
function [stat] = sine_with_markers ()
|
|
% Standard example plot from MATLAB's help pages.
|
|
stat.description = [ 'Twisted plot of the sine function. ' ,...
|
|
'Pay particular attention to how markers and Infs/NaNs are treated.' ];
|
|
|
|
x = -pi:pi/10:pi;
|
|
y = sin(x);
|
|
y(3) = NaN;
|
|
y(7) = Inf;
|
|
y(11) = -Inf;
|
|
plot(x,y,'--o', 'Color', [0.6,0.2,0.0], ...
|
|
'LineWidth', 1*360/127,...
|
|
'MarkerEdgeColor','k',...
|
|
'MarkerFaceColor',[0.3,0.1,0.0],...
|
|
'MarkerSize', 5*360/127 );
|
|
|
|
set( gca, 'Color', [0.9 0.9 1], ...
|
|
'XTickLabel', [], ...
|
|
'YTickLabel', [] ...
|
|
);
|
|
|
|
set(gca,'XTick',[0]);
|
|
set(gca,'XTickLabel',{'null'});
|
|
end
|
|
% =========================================================================
|
|
function [stat] = markerSizes()
|
|
stat.description = 'Marker sizes.';
|
|
|
|
hold on;
|
|
|
|
h = fill([1 1 2 2],[1 2 2 1],'r');
|
|
set(h,'LineWidth',10);
|
|
|
|
plot([0],[0],'go','Markersize',14,'LineWidth',10)
|
|
plot([0],[0],'bo','Markersize',14,'LineWidth',1)
|
|
end
|
|
% =========================================================================
|
|
function [stat] = markerSizes2()
|
|
stat.description = 'Line plot with with different marker sizes.';
|
|
|
|
hold on;
|
|
grid on;
|
|
|
|
n = 1:10;
|
|
d = 10;
|
|
s = round(linspace(6,25,10));
|
|
e = d * ones(size(n));
|
|
style = {'bx','rd','go','c.','m+','y*','bs','mv','k^','r<','g>','cp','bh'};
|
|
nStyles = numel(style);
|
|
|
|
for ii = 1:nStyles
|
|
for jj = 1:10
|
|
plot(n(jj), ii * e(jj),style{ii},'MarkerSize',s(jj));
|
|
end
|
|
end
|
|
xlim([min(n)-1 max(n)+1]);
|
|
ylim([0 d*(nStyles+1)]);
|
|
set(gca,'XTick',n,'XTickLabel',s,'XTickLabelMode','manual');
|
|
end
|
|
% =========================================================================
|
|
function [stat] = sine_with_annotation ()
|
|
stat.description = [ 'Plot of the sine function. ',...
|
|
'Pay particular attention to how titles and annotations are treated.' ];
|
|
stat.unreliable = isOctave || isMATLAB('>=',[8,4]) ... %FIXME: investigate
|
|
|| isMATLAB('<=', [8,3]); %FIXME: broken since decd496 (mac vs linux)
|
|
|
|
x = -pi:.1:pi; %TODO: the 0.1 step is probably a bad idea (not representable in float)
|
|
y = sin(x);
|
|
h = plot(x,y);
|
|
set(gca,'XTick',-pi:pi/2:pi);
|
|
|
|
set(gca,'XTickLabel',{'-pi','-pi/2','0','pi/2','pi'});
|
|
|
|
xlabel('-\pi \leq \Theta \leq \pi');
|
|
ylabel('sin(\Theta)');
|
|
title({'Plot of sin(\Theta)','subtitle','and here''s one really long subtitle' });
|
|
text(-pi/4,sin(-pi/4),'\leftarrow sin(-\pi\div4)',...
|
|
'HorizontalAlignment','left');
|
|
|
|
% Doesn't work in Octave
|
|
%set(findobj(gca,'Type','line','Color',[0 0 1]),...
|
|
% 'Color','red',...
|
|
% 'LineWidth',10);
|
|
|
|
end
|
|
% =========================================================================
|
|
function [stat] = linesWithOutliers()
|
|
stat.description = 'Lines with outliers.';
|
|
stat.issues = [392,400];
|
|
|
|
far = 200;
|
|
x = [ -far, -1, -1, -far, -10, -0.5, 0.5, 10, far, 1, 1, far, 10, 0.5, -0.5, -10, -far ];
|
|
y = [ -10, -0.5, 0.5, 10, far, 1, 1, far, 10, 0.5, -0.5, -10, -far, -1, -1, -far, -0.5 ];
|
|
plot( x, y,'o-');
|
|
axis( [-2,2,-2,2] );
|
|
end
|
|
% =========================================================================
|
|
function [stat] = peaks_contour()
|
|
stat.description = 'Test contour plots.';
|
|
stat.unreliable = isMATLAB('<', [8,4]) || isOctave; %R2014a and older
|
|
% FIXME: see #604; contour() produces inconsistent output
|
|
|
|
subplot(121)
|
|
[C, h] = contour(peaks(20),10);
|
|
clabel(C, h);
|
|
|
|
% remove y-ticks
|
|
set(gca,'YTickLabel',[]);
|
|
set(gca,'YTick',[]);
|
|
|
|
colormap winter;
|
|
|
|
% Contour layers with predefined color
|
|
subplot(122)
|
|
contour(peaks(20), 10,'r', 'LineWidth', 5)
|
|
set(gca,'YTickLabel',[]);
|
|
set(gca,'YTick',[]);
|
|
end
|
|
% =========================================================================
|
|
function [stat] = contourPenny()
|
|
stat.description = 'Contour plot of a US\$ Penny.';
|
|
stat.unreliable = isMATLAB('<', [8,4]);
|
|
% FIXME: see #604; contour() produces inconsistent output (mac/windows of PeterPablo)
|
|
stat.issues = [49 404];
|
|
|
|
if ~exist('penny.mat','file')
|
|
fprintf( 'penny data set not found. Skipping.\n\n' );
|
|
stat.skip = true;
|
|
return;
|
|
end
|
|
|
|
load penny;
|
|
contour(flipud(P));
|
|
axis square;
|
|
|
|
end
|
|
% =========================================================================
|
|
function [stat] = peaks_contourf ()
|
|
stat.description = 'Test the contourfill plots.';
|
|
stat.unreliable = isMATLAB('>=', [8,4]); % FIXME: inspect this
|
|
stat.issues = 582;
|
|
|
|
[trash, h] = contourf(peaks(20), 10);
|
|
hold on
|
|
plot(1:20)
|
|
colorbar();
|
|
legend(h, 'Contour');
|
|
colormap hsv;
|
|
end
|
|
% =========================================================================
|
|
function [stat] = double_colorbar()
|
|
stat.description = 'Double colorbar.';
|
|
|
|
if isOctave()
|
|
fprintf( 'Octave can''t handle tight axes.\n\n' );
|
|
stat.skip = true;
|
|
return
|
|
end
|
|
|
|
vspace = linspace(-40,40,20);
|
|
speed_map = magic(20).';
|
|
Q1_map = magic(20);
|
|
|
|
subplot(1, 2, 1);
|
|
contour(vspace(9:17),vspace(9:17),speed_map(9:17,9:17),20)
|
|
colorbar
|
|
axis tight
|
|
axis square
|
|
xlabel('$v_{2d}$')
|
|
ylabel('$v_{2q}$')
|
|
|
|
subplot(1, 2, 2)
|
|
contour(vspace(9:17),vspace(9:17),Q1_map(9:17,9:17),20)
|
|
colorbar
|
|
axis tight
|
|
axis square
|
|
xlabel('$v_{2d}$')
|
|
ylabel('$v_{2q}$')
|
|
end
|
|
% =========================================================================
|
|
function [stat] = randomWithLines()
|
|
stat.description = 'Lissajous points with lines.';
|
|
|
|
beta = 42.42;
|
|
t = 1:150;
|
|
X = [sin(t); cos(beta * t)].';
|
|
|
|
X(:,1) = (X(:,1) * 90) + 75;
|
|
plot(X(:,1),X(:,2),'o');
|
|
hold on;
|
|
M(1)=min(X(:,1));
|
|
M(2)=max(X(:,1));
|
|
mn = mean(X(:,2));
|
|
s = std(X(:,2));
|
|
plot(M,[mean(X(:,2)) mean(X(:,2))],'k-');
|
|
plot(M,mn + 1*[s s],'--');
|
|
plot(M,mn - 2*[s s],'--');
|
|
axis('tight');
|
|
end
|
|
% =========================================================================
|
|
function [stat] = many_random_points ()
|
|
stat.description = 'Test the performance when drawing many points.';
|
|
|
|
n = 1e3;
|
|
alpha = 1024;
|
|
beta = 1;
|
|
gamma = 5.47;
|
|
|
|
x = cos( (1:n) * alpha );
|
|
y = sin( (1:n) * beta + gamma);
|
|
|
|
plot ( x, y, '.r' );
|
|
axis([ 0, 1, 0, 1 ])
|
|
end
|
|
% =========================================================================
|
|
function [stat] = double_axes()
|
|
stat.description = 'Double axes';
|
|
|
|
dyb = 0.1; % normalized units, bottom offset
|
|
dyt = 0.1; % separation between subsequent axes bottoms
|
|
|
|
x = [0; 24; 48; 72; 96;];
|
|
y = [7.653 7.473 7.637 7.652 7.651];
|
|
|
|
grid on
|
|
h1 = plot(x,y,'Color','k');
|
|
|
|
% following code is taken from `floatAxisX.m'
|
|
|
|
% get position of axes
|
|
allAxes = findobj(gcf,'type','axes');
|
|
naxes = length(allAxes);
|
|
ax1Pos = get(allAxes(naxes),'position');
|
|
|
|
% rescale and reposition all axes to handle additional axes
|
|
for an=1:naxes-1
|
|
if isequal(rem(an,2),0)
|
|
% even ones in array of axes handles represent axes on which lines are plotted
|
|
set(allAxes(an),'Position',[ax1Pos(1,1) ax1Pos(1,2)+dyb ax1Pos(1,3) ax1Pos(1,4)-dyt])
|
|
else
|
|
% odd ones in array of axes handles represent axes on which floating x-axss exist
|
|
axPos = get(allAxes(an),'Position');
|
|
set(allAxes(an),'Position',[axPos(1,1) axPos(1,2)+dyb axPos(1,3) axPos(1,4)])
|
|
end
|
|
end
|
|
% first axis a special case (doesn't fall into even/odd scenario of figure children)
|
|
set(allAxes(naxes),'Position',[ax1Pos(1,1) ax1Pos(1,2)+dyb ax1Pos(1,3) ax1Pos(1,4)-dyt])
|
|
ylimit1 = get(allAxes(naxes),'Ylim');
|
|
|
|
% get new position for plotting area of figure
|
|
ax1Pos = get(allAxes(naxes),'position');
|
|
|
|
% axis to which the floating axes will be referenced
|
|
ref_axis = allAxes(1);
|
|
refPosition = get(ref_axis,'position');
|
|
|
|
% overlay new axes on the existing one
|
|
ax2 = axes('Position',ax1Pos);
|
|
% plot data and return handle for the line
|
|
hl1 = plot(x,y,'k');
|
|
% make the new axes invisible, leaving only the line visible
|
|
set(ax2,'visible','off','ylim',ylimit1)
|
|
|
|
% set the axis limit mode so that it does not change if the
|
|
% user resizes the figure window
|
|
set(ax2,'xLimMode','manual')
|
|
|
|
% set up another set of axes to act as floater
|
|
ax3 = axes('Position',[refPosition(1) refPosition(2)-dyb refPosition(3) 0.01]);
|
|
|
|
set(ax3,'box','off','ycolor','w','yticklabel',[],'ytick',[])
|
|
set(ax3,'XMinorTick','on','color','none','xcolor',get(hl1,'color'))
|
|
|
|
xlabel('secondary axis')
|
|
end
|
|
% =========================================================================
|
|
function [stat] = double_axes2()
|
|
stat.description = 'Double overlayed axes with a flip.' ;
|
|
|
|
ah1=axes;
|
|
ph=plot([0 1],[0 1]);
|
|
|
|
title('Title')
|
|
ylabel('y')
|
|
xlabel('x')
|
|
|
|
% add a new set of axes
|
|
% to make a gray grid
|
|
ah2=axes;
|
|
% make the background transparent
|
|
set(ah1,'color','none')
|
|
% move these axes to the back
|
|
set(gcf,'Children',flipud(get(gcf,'Children')))
|
|
end
|
|
% =========================================================================
|
|
function [stat] = logplot()
|
|
stat.description = 'Test logscaled axes.';
|
|
% This was once unreliable (and linked to #590). Mac and Linux seem fine.
|
|
|
|
x = logspace(-1,2);
|
|
y = exp(x);
|
|
loglog(x, y, '-s')
|
|
|
|
ylim([1 1e45]);
|
|
grid on;
|
|
if isprop(gca,'GridColor')
|
|
set(gca, 'GridColor', 'red');
|
|
set(gca, 'MinorGridColor', 'blue');
|
|
else
|
|
%TODO equivalent HG1 settings (if those exist)
|
|
end
|
|
end
|
|
% =========================================================================
|
|
function [stat] = colorbarLogplot()
|
|
stat.description = 'Logscaled colorbar.';
|
|
stat.unreliable = isOctave; % FIXME: investigate (Travis differs from Linux/Mac octave)
|
|
% https://github.com/matlab2tikz/matlab2tikz/pull/641#issuecomment-120481564
|
|
|
|
imagesc([1 10 100]);
|
|
try
|
|
set(colorbar(), 'YScale', 'log');
|
|
catch
|
|
warning('M2TAcid:LogColorBar',...
|
|
'Logarithmic Colorbars are not documented in MATLAB R2014b and Octave');
|
|
stat.skip = true;
|
|
end
|
|
end
|
|
% =========================================================================
|
|
function [stat] = legendplot()
|
|
stat.description = 'Test inserting of legends.';
|
|
stat.unreliable = isMATLAB || isOctave; % FIXME: investigate
|
|
|
|
% x = -pi:pi/20:pi;
|
|
% plot(x,cos(x),'-ro',x,sin(x),'-.b');
|
|
% h = legend('one pretty long legend cos_x','sin_x',2);
|
|
% set(h,'Interpreter','none');
|
|
|
|
x = linspace(0, 2*pi, 1e5);
|
|
plot( x, sin(x), 'b', ...
|
|
x, cos(x), 'r' );
|
|
xlim( [0 2*pi] )
|
|
ylim( [-0.9 0.9] )
|
|
title( '{tikz test}' )
|
|
xlabel( '{x-Values}' )
|
|
ylabel( '{y-Values}' )
|
|
legend( 'sin(x)', 'cos(x)', 'Location','NorthOutside', ...
|
|
'Orientation', 'Horizontal' );
|
|
grid on;
|
|
end
|
|
% =========================================================================
|
|
function [stat] = legendplotBoxoff ()
|
|
stat.description = 'Test inserting of legends.';
|
|
stat.issues = [607,609];
|
|
|
|
x = -pi:pi/20:pi;
|
|
l = plot(x, cos(x),'-ro',...
|
|
x, sin(x),'-.b');
|
|
h = legend(l(2), 'one pretty long legend sin_x (dash-dot)', 'Location', 'northeast');
|
|
set(h, 'Interpreter', 'none');
|
|
legend boxoff
|
|
end
|
|
% =========================================================================
|
|
function [stat] = plotyyLegends()
|
|
stat.description = 'More legends.';
|
|
|
|
x = 0:.1:7;
|
|
y1 = sin(x);
|
|
y2 = cos(x);
|
|
[ax,h1,h2] = plotyy(x,y1,x,y2);
|
|
legend([h1;h2],'Sine','Cosine');
|
|
end
|
|
% =========================================================================
|
|
function [stat] = zoom()
|
|
stat.description = ['Test function \texttt{pruneOutsideBox()} ', ...
|
|
'and \texttt{movePointsCloser()} ', ...
|
|
'of \texttt{cleanfigure()}.'];
|
|
stat.unreliable = isOctave; %FIXME: investigate
|
|
stat.issues = [226,392,400];
|
|
|
|
% Setup
|
|
subplot(311)
|
|
plot(1:10,10:-1:1,'-r*',1:15,repmat(9,1,15),'-g*',[5.5,5.5],[1,9],'-b*')
|
|
hold on;
|
|
stairs(1:10,'-m*');
|
|
plot([2,8.5,8.5,2,2],[2,2,7.5,7.5,2],'--k');
|
|
title('setup');
|
|
legend('cross with points','no cross','cross no points','stairs','zoom area');
|
|
|
|
% Last comes before simple zoomin due to cleanfigure
|
|
subplot(313)
|
|
plot(1:10,10:-1:1,'-r*',1:10,repmat(9,1,10),'-g*',[5.5,5.5],[1,9],'-b*');
|
|
hold on;
|
|
stairs(1:10,'-m*');
|
|
xlim([2, 8.5]), ylim([2,7.5]);
|
|
cleanfigure(); % FIXME: this generates many "division by zero" in Octave
|
|
plot([2,8.5,8.5,2,2],[2,2,7.5,7.5,2],'--k');
|
|
xlim([0, 15]), ylim([0,10]);
|
|
title('zoom in, cleanfigure, zoom out');
|
|
|
|
% Simple zoom in
|
|
subplot(312)
|
|
plot(1:10,10:-1:1,'-r*',1:10,repmat(9,1,10),'-g*',[5.5,5.5],[1,9],'-b*');
|
|
hold on;
|
|
stairs(1:10,'-m*');
|
|
xlim([2, 8.5]), ylim([2,7.5]);
|
|
title('zoom in');
|
|
end
|
|
% =========================================================================
|
|
function [stat] = bars()
|
|
stat.description = '2x2 Subplot with different bars';
|
|
stat.unreliable = isOctave || isMATLAB('>=', [8,4]) || ... % FIXME: investigate
|
|
isMATLAB('<=', [8,3]); %FIXME: #749 (Jenkins)
|
|
|
|
% dataset grouped
|
|
bins = 10 * (-0.5:0.1:0.5);
|
|
numEntries = length(bins);
|
|
|
|
alpha = [13 11 7];
|
|
numBars = numel(alpha);
|
|
plotData = zeros(numEntries, numBars);
|
|
for iBar = 1:numBars
|
|
plotData(:,iBar) = abs(round(100*sin(alpha(iBar)*(1:numEntries))));
|
|
end
|
|
|
|
% dataset stacked
|
|
data = ACID_data;
|
|
Y = round(abs(data(2:6,1:3))/10);
|
|
|
|
subplot(2,2,1);
|
|
b1 = bar(bins,plotData,'grouped','BarWidth',1.5);
|
|
set(gca,'XLim',[1.25*min(bins) 1.25*max(bins)]);
|
|
|
|
subplot(2,2,2);
|
|
barh(bins, plotData, 'grouped', 'BarWidth', 1.3);
|
|
|
|
subplot(2,2,3);
|
|
bar(Y, 'stacked');
|
|
|
|
subplot(2,2,4);
|
|
b2= barh(Y,'stacked','BarWidth', 0.75);
|
|
|
|
set(b1(1),'FaceColor','m','EdgeColor','none')
|
|
set(b2(1),'FaceColor','c','EdgeColor','none')
|
|
|
|
end
|
|
% =========================================================================
|
|
function [stat] = stemplot()
|
|
stat.description = 'A simple stem plot.' ;
|
|
|
|
x = 0:25;
|
|
y = [exp(-.07*x).*cos(x);
|
|
exp(.05*x).*cos(x)]';
|
|
h = stem(x, y);
|
|
legend( 'exp(-.07x)*cos(x)', 'exp(.05*x)*cos(x)', 'Location', 'NorthWest');
|
|
set(h(1),'MarkerFaceColor','blue');
|
|
set(h(2),'MarkerFaceColor','red','Marker','square');
|
|
|
|
% Octave 4 has some smart behavior: it only prints a single baseline.
|
|
% Let's mimick this behavior everywhere else.
|
|
baselines = findall(gca, 'Type', 'line', 'Color', [0 0 0]);
|
|
if numel(baselines) > 1
|
|
% We only need the last line in Octave 3.8, as that is where
|
|
% Octave 4.0 places the baseline
|
|
delete(baselines(1:end-1));
|
|
end
|
|
end
|
|
% =========================================================================
|
|
function [stat] = stemplot2()
|
|
stat.description = 'Another simple stem plot.';
|
|
stat.unreliable = isOctave('>=', 4); %FIXME: see #759, #757/#759 and #687
|
|
|
|
x = 0:25;
|
|
y = [exp(-.07*x).*cos(x);
|
|
exp(.05*x).*cos(x)]';
|
|
h = stem(x, y, 'filled');
|
|
legend( 'exp(-.07x)*cos(x)', 'exp(.05*x)*cos(x)', 'Location', 'NorthWest');
|
|
end
|
|
% =========================================================================
|
|
function [stat] = stairsplot()
|
|
stat.description = 'A simple stairs plot.' ;
|
|
|
|
X = linspace(-2*pi,2*pi,40)';
|
|
Yconst = [zeros(10,1); 0.5*ones(20,1);-0.5*ones(10,1)];
|
|
Y = [sin(X), 0.2*cos(X), Yconst];
|
|
h = stairs(Y);
|
|
legend(h(2),'second entry')
|
|
end
|
|
% =========================================================================
|
|
function [stat] = quiverplot()
|
|
stat.description = 'A combined quiver/contour plot of $x\exp(-x^2-y^2)$.' ;
|
|
stat.extraOptions = {'arrowHeadSize', 2};
|
|
|
|
[X,Y] = meshgrid(-2:.2:2);
|
|
Z = X.*exp(-X.^2 - Y.^2);
|
|
[DX,DY] = gradient(Z,.2,.2);
|
|
contour(X,Y,Z);
|
|
hold on
|
|
quiver(X,Y,DX,DY);
|
|
%TODO: also show a `quiver(X,Y,DX,DY,0);` to test without scaling
|
|
colormap hsv;
|
|
hold off
|
|
end
|
|
% =========================================================================
|
|
function [stat] = quiver3plot()
|
|
stat.description = 'Three-dimensional quiver plot.' ;
|
|
stat.unreliable = isMATLAB(); %FIXME: #590
|
|
|
|
vz = 10; % Velocity
|
|
a = -32; % Acceleration
|
|
|
|
t = 0:.1:1;
|
|
z = vz*t + 1/2*a*t.^2;
|
|
|
|
vx = 2;
|
|
x = vx*t;
|
|
vy = 3;
|
|
y = vy*t;
|
|
|
|
u = gradient(x);
|
|
v = gradient(y);
|
|
w = gradient(z);
|
|
scale = 0;
|
|
quiver3(x,y,z,u,v,w,scale)
|
|
view([70 18])
|
|
end
|
|
% =========================================================================
|
|
function [stat] = quiveroverlap ()
|
|
stat.description = 'Quiver plot with avoided overlap.';
|
|
stat.issues = [679];
|
|
% TODO: As indicated in #679, the native quiver scaling algorithm still isn't
|
|
% perfect. As such, in MATLAB the arrow heads may appear extremely tiny.
|
|
% In Octave, they look fine though. Once the scaling has been done decently,
|
|
% this reminder can be removed.
|
|
if isOctave
|
|
stat.extraOptions = {'arrowHeadSize', 20};
|
|
end
|
|
|
|
x = [0 1];
|
|
y = [0 0];
|
|
u = [1 -1];
|
|
v = [1 1];
|
|
|
|
hold all;
|
|
qvr1 = quiver(x,y,u,v);
|
|
qvr2 = quiver(x,y,2*u,2*v);
|
|
set(qvr2, 'MaxHeadSize', get(qvr1, 'MaxHeadSize')/2);
|
|
end
|
|
% =========================================================================
|
|
function [stat] = polarplot ()
|
|
stat.description = 'A simple polar plot.' ;
|
|
stat.extraOptions = {'showHiddenStrings',true};
|
|
stat.unreliable = isOctave('>=', 4) || ... %FIXME: see #759, #757/#759 and #687
|
|
isMATLAB('<=', [8,3]); %FIXME: broken since decd496 (mac vs linux)
|
|
t = 0:.01:2*pi;
|
|
polar(t,sin(2*t).*cos(2*t),'--r')
|
|
end
|
|
% =========================================================================
|
|
function [stat] = roseplot ()
|
|
stat.description = 'A simple rose plot.' ;
|
|
stat.extraOptions = {'showHiddenStrings',true};
|
|
stat.unreliable = isOctave('>=', 4) || ... %FIXME: see #759, #757/#759 and #687
|
|
isMATLAB('<=', [8,3]); %FIXME: broken since decd496 (mac vs linux)
|
|
|
|
theta = 2*pi*sin(linspace(0,8,100));
|
|
rose(theta);
|
|
end
|
|
% =========================================================================
|
|
function [stat] = compassplot ()
|
|
stat.description = 'A simple compass plot.' ;
|
|
stat.extraOptions = {'showHiddenStrings',true};
|
|
stat.unreliable = isOctave('>=', 4) || ... %FIXME: see #759, #757/#759 and #687
|
|
isMATLAB('<=', [8,3]); %FIXME: broken since decd496 (mac vs linux)
|
|
|
|
Z = (1:20).*exp(1i*2*pi*cos(1:20));
|
|
compass(Z);
|
|
end
|
|
% =========================================================================
|
|
function [stat] = logicalImage()
|
|
stat.description = 'An image plot of logical matrix values.' ;
|
|
stat.unreliable = isOctave; %FIXME: investigate
|
|
% different `width`, see issue #552# (comment 76918634); (Travis differs from Linux/Mac octave)
|
|
|
|
plotData = magic(10);
|
|
imagesc(plotData > mean(plotData(:)));
|
|
colormap('hot');
|
|
end
|
|
% =========================================================================
|
|
function [stat] = imagescplot()
|
|
stat.description = 'An imagesc plot of $\sin(x)\cos(y)$.';
|
|
stat.unreliable = isOctave; %FIXME: investigate (Travis differs from Linux/Mac octave)
|
|
|
|
pointsX = 10;
|
|
pointsY = 20;
|
|
x = 0:1/pointsX:1;
|
|
y = 0:1/pointsY:1;
|
|
z = sin(x)'*cos(y);
|
|
imagesc(x,y,z);
|
|
end
|
|
% =========================================================================
|
|
function [stat] = imagescplot2()
|
|
stat.description = 'A trimmed imagesc plot.';
|
|
stat.unreliable = isOctave; %FIXME: investigate (Travis differs from Linux/Mac octave)
|
|
|
|
a=magic(10);
|
|
x=-5:1:4;
|
|
y=10:19;
|
|
imagesc(x,y,a)
|
|
|
|
xlim([-3,2])
|
|
ylim([12,15])
|
|
|
|
grid on;
|
|
end
|
|
% =========================================================================
|
|
function [stat] = xAxisReversed ()
|
|
stat.description = 'Reversed axes with legend.' ;
|
|
|
|
n = 100;
|
|
x = (0:1/n:1);
|
|
y = exp(x);
|
|
plot(x,y);
|
|
set(gca,'XDir','reverse');
|
|
set(gca,'YDir','reverse');
|
|
if isOctave('<=', [3,8])
|
|
% TODO: see whether we can unify this syntax for all environments
|
|
% at the moment, the generic syntax doesn't seem to work for Octave
|
|
% 3.8 (it doesn't even show a legend in gnuplut).
|
|
legend( 'data1', 'Location', 'SouthWest' );
|
|
else
|
|
legend( 'Location', 'SouthWest' );
|
|
end
|
|
end
|
|
% =========================================================================
|
|
function [stat] = subplot2x2b ()
|
|
stat.description = 'Three aligned subplots on a $2\times 2$ subplot grid.' ;
|
|
stat.unreliable = isOctave || isMATLAB();
|
|
% FIXME: this test is unreliable because the automatic axis limits
|
|
% differ on different test platforms. Reckon this by creating the figure
|
|
% using `ACID(97)` and then manually slightly modify the window size.
|
|
% We should not set the axis limits explicitly rather find a better way.
|
|
% #591
|
|
|
|
x = (1:5);
|
|
|
|
subplot(2,2,1);
|
|
y = sin(x.^3);
|
|
plot(x,y);
|
|
|
|
subplot(2,2,2);
|
|
y = cos(x.^3);
|
|
plot(x,y);
|
|
|
|
subplot(2,2,3:4);
|
|
y = tan(x);
|
|
plot(x,y);
|
|
end
|
|
% =========================================================================
|
|
function [stat] = manualAlignment()
|
|
stat.description = 'Manually aligned figures.';
|
|
|
|
xrange = linspace(-3,4,2*1024);
|
|
|
|
axes('Position', [0.1 0.1 0.85 0.15]);
|
|
plot(xrange);
|
|
ylabel('$n$');
|
|
xlabel('$x$');
|
|
|
|
axes('Position', [0.1 0.25 0.85 0.6]);
|
|
plot(xrange);
|
|
set(gca,'XTick',[]);
|
|
end
|
|
% =========================================================================
|
|
function [stat] = subplotCustom ()
|
|
stat.description = 'Three customized aligned subplots.';
|
|
stat.unreliable = isMATLAB(); % FIXME: #590
|
|
|
|
x = (1:5);
|
|
|
|
y = cos(sqrt(x));
|
|
subplot( 'Position', [0.05 0.1 0.3 0.3] )
|
|
plot(x,y);
|
|
|
|
y = sin(sqrt(x));
|
|
subplot( 'Position', [0.35 0.5 0.3 0.3] )
|
|
plot(x,y);
|
|
|
|
y = tan(sqrt(x));
|
|
subplot( 'Position', [0.65 0.1 0.3 0.3] )
|
|
plot(x,y);
|
|
end
|
|
% =========================================================================
|
|
function [stat] = errorBars()
|
|
stat.description = 'Generic error bar plot.';
|
|
|
|
data = ACID_data;
|
|
plotData = 1:10;
|
|
|
|
eH = abs(data(1:10,1))/10;
|
|
eL = abs(data(1:10,3))/50;
|
|
|
|
x = 1:10;
|
|
hold all;
|
|
errorbar(x, plotData, eL, eH, '.')
|
|
h = errorbar(x+0.5, plotData, eL, eH);
|
|
set(h, 'LineStyle', 'none');
|
|
% Octave 3.8 doesn't support passing extra options to |errorbar|, but
|
|
% it does allow for changing it after the fact
|
|
end
|
|
% =========================================================================
|
|
function [stat] = errorBars2()
|
|
stat.description = 'Another error bar example.';
|
|
data = ACID_data;
|
|
y = mean( data, 2 );
|
|
e = std( data, 1, 2 );
|
|
errorbar( y, e, 'xr' );
|
|
end
|
|
% =========================================================================
|
|
function [stat] = legendsubplots()
|
|
stat.description = [ 'Subplots with legends. ' , ...
|
|
'Increase value of "length" in the code to stress-test your TeX installation.' ];
|
|
stat.unreliable = isOctave; %FIXME: investigate
|
|
stat.issues = 609;
|
|
|
|
% size of upper subplot
|
|
rows = 4;
|
|
% number of points. A large number here (eg 1000) will stress-test
|
|
% matlab2tikz and your TeX installation. Be prepared for it to run out of
|
|
% memory
|
|
length = 100;
|
|
|
|
% generate some spurious data
|
|
t = 0:(4*pi)/length:4*pi;
|
|
x = t;
|
|
a = t;
|
|
y = sin(t) + 0.1*sin(134*t.^2);
|
|
b = sin(t) + 0.1*cos(134*t.^2) + 0.05*cos(2*t);
|
|
|
|
% plot the top figure
|
|
subplot(rows+2,1,1:rows);
|
|
|
|
% first line
|
|
sigma1 = std(y);
|
|
tracey = mean(y,1);
|
|
plot123 = plot(x,tracey,'b-');
|
|
|
|
hold on
|
|
|
|
% second line
|
|
sigma2 = std(b);
|
|
traceb = mean(b,1);
|
|
plot456 = plot(a,traceb,'r-');
|
|
|
|
spec0 = ['Mean V(t)_A (\sigma \approx ' num2str(sigma1,'%0.4f') ')'];
|
|
spec1 = ['Mean V(t)_B (\sigma \approx ' num2str(sigma2,'%0.4f') ')'];
|
|
|
|
hold off
|
|
%plot123(1:2)
|
|
legend([plot123; plot456],spec0,spec1)
|
|
legend boxoff
|
|
xlabel('Time/s')
|
|
ylabel('Voltage/V')
|
|
title('Time traces');
|
|
|
|
% now plot a differential trace
|
|
subplot(rows+2,1,rows+1:rows+2)
|
|
plot7 = plot(a,traceb-tracey,'k');
|
|
|
|
legend(plot7,'\Delta V(t)')
|
|
legend boxoff
|
|
xlabel('Time/s')
|
|
ylabel('\Delta V')
|
|
title('Differential time traces');
|
|
end
|
|
% =========================================================================
|
|
function [stat] = bodeplots()
|
|
stat.description = 'Bode plots with legends.';
|
|
stat.unreliable = isMATLAB(); % FIXME: inconsistent axis limits and
|
|
% tick positions; see #641 (issuecomment-106241711)
|
|
|
|
if isempty(which('tf'))
|
|
fprintf( 'function "tf" not found. Skipping.\n\n' );
|
|
stat.skip = true;
|
|
return
|
|
end
|
|
|
|
Rc=1;
|
|
C=1.5e-6; %F
|
|
|
|
% Set inductors
|
|
L1=4e-3;
|
|
L2=0.8e-3;
|
|
|
|
% Resistances of inductors
|
|
R1=4;
|
|
R2=2;
|
|
|
|
% Transfer functions
|
|
% Building transfer functions
|
|
s=tf('s');
|
|
Zc=1/(s*C)+Rc;
|
|
Z1=s*L1+R1;
|
|
Z2=s*L2+R2;
|
|
LCLd=(Z2+Zc)/(Z1+Zc);
|
|
LCL=(s^2*C*L2+1)/(s^2*C*L1+1);
|
|
|
|
t=logspace(3,5,1000);
|
|
bode(LCL,t)
|
|
hold on
|
|
bode(LCLd,t)
|
|
title('Voltage transfer function of a LCL filter')
|
|
set(findall(gcf,'type','line'),'linewidth',1.5)
|
|
grid on
|
|
|
|
legend('Perfect LCL',' Real LCL','Location','SW')
|
|
|
|
% Work around a peculiarity in MATLAB: when the figure is invisible,
|
|
% the XData/YData of all plots is NaN. It gets set to the proper values when
|
|
% the figure is actually displayed. To do so, we temporarily toggle this
|
|
% option. This triggers the call-back (and might flicker the figure).
|
|
isVisible = get(gcf,'visible');
|
|
set(gcf,'visible','on')
|
|
set(gcf,'visible',isVisible);
|
|
end
|
|
% =========================================================================
|
|
function [stat] = rlocusPlot()
|
|
stat.description = 'rlocus plot.';
|
|
stat.unreliable = isMATLAB(); % FIXME: radial grid is not present on all
|
|
% environments (see #641)
|
|
|
|
if isempty(which('tf'))
|
|
fprintf( 'function "tf" not found. Skipping.\n\n' );
|
|
stat.skip = true;
|
|
return
|
|
end
|
|
|
|
if isMATLAB('<', [8,4])
|
|
% in MATLAB R2014a and below, `rlocus` plots with no background color
|
|
% are not supported. So, force that color to white to work around
|
|
% that bug. Newer versions don't suffer from this.
|
|
set(gca, 'Color', 'w');
|
|
end
|
|
|
|
rlocus(tf([1 1],[4 3 1]))
|
|
|
|
% Work around a peculiarity in MATLAB: when the figure is invisible,
|
|
% the XData/YData of all plots is NaN. It gets set to the proper values when
|
|
% the figure is actually displayed. To do so, we temporarily toggle this
|
|
% option. This triggers the call-back (and might flicker the figure).
|
|
isVisible = get(gcf,'visible');
|
|
set(gcf,'visible','on')
|
|
set(gcf,'visible',isVisible);
|
|
end
|
|
% =========================================================================
|
|
function [stat] = mandrillImage()
|
|
stat.description = 'Picture of a mandrill.';
|
|
|
|
if ~exist('mandrill.mat','file')
|
|
fprintf( 'mandrill data set not found. Skipping.\n\n' );
|
|
stat.skip = true;
|
|
return
|
|
end
|
|
|
|
data = load( 'mandrill' );
|
|
image( data.X ) % show image
|
|
colormap( data.map ) % adapt colormap
|
|
axis image % pixels should be square
|
|
axis off % disable axis
|
|
end
|
|
% =========================================================================
|
|
function [stat] = besselImage()
|
|
stat.description = 'Bessel function.';
|
|
stat.unreliable = isOctave(); % FIXME (Travis differs from Linux/Mac octave)
|
|
|
|
nu = -5:0.25:5;
|
|
beta = 0:0.05:2.5;
|
|
|
|
m = length(beta);
|
|
n = length(nu);
|
|
trace = zeros(m,n);
|
|
for i=1:length(beta);
|
|
for j=1:length(nu)
|
|
if (floor(nu(j))==nu(j))
|
|
trace(i,j)=abs(besselj(nu(j),beta(i)));
|
|
end
|
|
end
|
|
end
|
|
|
|
imagesc(nu,beta,trace);
|
|
colorbar()
|
|
xlabel('Order')
|
|
ylabel('\beta')
|
|
set(gca,'YDir','normal')
|
|
end
|
|
% =========================================================================
|
|
function [stat] = clownImage()
|
|
stat.description = 'Picture of a clown.';
|
|
|
|
if ~exist('clown.mat','file')
|
|
fprintf( 'clown data set not found. Skipping.\n\n' );
|
|
stat.skip = true;
|
|
return
|
|
end
|
|
|
|
data = load( 'clown' );
|
|
imagesc( data.X )
|
|
colormap( gray )
|
|
end
|
|
% =========================================================================
|
|
function [stat] = zplanePlot1()
|
|
stat.description = 'Representation of the complex plane with zplane.';
|
|
stat.unreliable = isMATLAB('<', [8,4]); % FIXME: investigate
|
|
|
|
% check of the signal processing toolbox is installed
|
|
verInfo = ver('signal');
|
|
if isempty(verInfo) || isempty(verInfo.Name)
|
|
fprintf( 'Signal toolbox not found. Skip.\n\n' );
|
|
stat.skip = true;
|
|
|
|
return
|
|
end
|
|
|
|
[z,p] = ellip(4,3,30,200/500);
|
|
zplane(z,p);
|
|
title('4th-Order Elliptic Lowpass Digital Filter');
|
|
end
|
|
% =========================================================================
|
|
function [stat] = zplanePlot2()
|
|
stat.description = 'Representation of the complex plane with zplane.';
|
|
stat.unreliable = isMATLAB; % FIXME: #604; only difference is `width`
|
|
stat.closeall = true;
|
|
|
|
% check of the signal processing toolbox is installed
|
|
verInfo = ver('signal');
|
|
if isempty(verInfo) || isempty(verInfo.Name)
|
|
fprintf( 'Signal toolbox not found. Skip.\n\n' );
|
|
stat.skip = true;
|
|
return
|
|
end
|
|
|
|
[b,a] = ellip(4,3,30,200/500);
|
|
Hd = dfilt.df1(b,a);
|
|
zplane(Hd) % FIXME: This opens a new figure that doesn't get closed automatically
|
|
end
|
|
% =========================================================================
|
|
function [stat] = freqResponsePlot()
|
|
stat.description = 'Frequency response plot.';
|
|
stat.closeall = true;
|
|
stat.issues = [409];
|
|
stat.unreliable = isMATLAB(); % FIXME: investigate
|
|
% See also: https://github.com/matlab2tikz/matlab2tikz/pull/759#issuecomment-138477207
|
|
% and https://gist.github.com/PeterPablo/b01cbe8572a9e5989037 (R2014b)
|
|
|
|
% check of the signal processing toolbox is installed
|
|
verInfo = ver('signal');
|
|
if isempty(verInfo) || isempty(verInfo.Name)
|
|
fprintf( 'Signal toolbox not found. Skip.\n\n' );
|
|
stat.skip = true;
|
|
return
|
|
end
|
|
|
|
b = fir1(80,0.5,kaiser(81,8));
|
|
hd = dfilt.dffir(b);
|
|
freqz(hd); % FIXME: This opens a new figure that doesn't get closed automatically
|
|
end
|
|
% =========================================================================
|
|
function [stat] = axesLocation()
|
|
stat.description = 'Swapped axis locations.';
|
|
stat.issues = 259;
|
|
|
|
plot(cos(1:10));
|
|
set(gca,'XAxisLocation','top');
|
|
set(gca,'YAxisLocation','right');
|
|
end
|
|
% =========================================================================
|
|
function [stat] = axesColors()
|
|
stat.description = 'Custom axes colors.';
|
|
|
|
plot(sin(1:15));
|
|
set(gca,'XColor','g','YColor','b');
|
|
% set(gca,'XColor','b','YColor','k');
|
|
box off;
|
|
end
|
|
% =========================================================================
|
|
function [stat] = multipleAxes()
|
|
stat.description = 'Multiple axes.';
|
|
|
|
x1 = 0:.1:40;
|
|
y1 = 4.*cos(x1)./(x1+2);
|
|
x2 = 1:.2:20;
|
|
y2 = x2.^2./x2.^3;
|
|
|
|
line(x1,y1,'Color','r');
|
|
ax1 = gca;
|
|
set(ax1,'XColor','r','YColor','r')
|
|
|
|
ax2 = axes('Position',get(ax1,'Position'),...
|
|
'XAxisLocation','top',...
|
|
'YAxisLocation','right',...
|
|
'Color','none',...
|
|
'XColor','k','YColor','k');
|
|
|
|
line(x2,y2,'Color','k','Parent',ax2);
|
|
|
|
xlimits = get(ax1,'XLim');
|
|
ylimits = get(ax1,'YLim');
|
|
xinc = (xlimits(2)-xlimits(1))/5;
|
|
yinc = (ylimits(2)-ylimits(1))/5;
|
|
|
|
% Now set the tick mark locations.
|
|
set(ax1,'XTick',xlimits(1):xinc:xlimits(2) ,...
|
|
'YTick',ylimits(1):yinc:ylimits(2) )
|
|
end
|
|
% =========================================================================
|
|
function [stat] = scatterPlotRandom()
|
|
stat.description = 'Generic scatter plot.';
|
|
|
|
n = 1:100;
|
|
|
|
% MATLAB: Use the default area of 36 points squared. The units for the
|
|
% marker area is points squared.
|
|
% octave: If s is not given, [...] a default value of 8 points is used.
|
|
% Try obtain similar behavior and thus apply square root: sqrt(36) vs. 8
|
|
sArea = 1000*(1+cos(n.^1.5)); % scatter size in unit points squared
|
|
sRadius = sqrt(sArea*pi);
|
|
if isMATLAB()
|
|
s = sArea; % unit: points squared
|
|
elseif isOctave()
|
|
s = sRadius; % unit: points
|
|
end
|
|
|
|
scatter(n, n, s, n.^8);
|
|
colormap autumn;
|
|
end
|
|
% =========================================================================
|
|
function [stat] = scatterPlot()
|
|
stat.description = 'Scatter plot with MATLAB(R) stat.';
|
|
if ~exist('seamount.mat','file')
|
|
fprintf( 'seamount data set not found. Skipping.\n\n' );
|
|
stat.skip = true;
|
|
return
|
|
end
|
|
|
|
data = load( 'seamount' );
|
|
scatter( data.x, data.y, 5, data.z, '^' );
|
|
end
|
|
% =========================================================================
|
|
function [stat] = scatterPlotMarkers()
|
|
stat.description = 'Scatter plot with with different marker sizes and legend.';
|
|
% FIXME: octave: Output is empty?! Potentially fixed by #669
|
|
|
|
n = 1:10;
|
|
d = 10;
|
|
e = d * ones(size(n));
|
|
|
|
% MATLAB: Use the default area of 36 points squared. The units for the
|
|
% marker area is points squared.
|
|
% octave: If s is not given, [...] a default value of 8 points is used.
|
|
% Try obtain similar behavior and thus apply square root: sqrt(36) vs. 8
|
|
sArea = d^2 * n; % scatter size in unit points squared
|
|
sRadius = sqrt(sArea);
|
|
if isMATLAB()
|
|
s = sArea; % unit: points squared
|
|
elseif isOctave()
|
|
s = sRadius; % unit: points
|
|
end
|
|
|
|
grid on;
|
|
hold on;
|
|
|
|
style = {'bx','rd','go','c.','m+','y*','bs','mv','k^','r<','g>','cp','bh'};
|
|
names = {'bx','rd','go','c.','m plus','y star','bs','mv',...
|
|
'k up triangle','r left triangle','g right triangle','cp','bh'};
|
|
|
|
nStyles = numel(style);
|
|
for ii = 1:nStyles
|
|
curr = style{ii};
|
|
scatter(n, ii * e, s, curr(1), curr(2));
|
|
end
|
|
xlim([min(n)-1 max(n)+1]);
|
|
ylim([0 d*(nStyles+1)]);
|
|
set(gca,'XTick',n,'XTickLabel',sArea,'XTickLabelMode','manual');
|
|
end
|
|
% =========================================================================
|
|
function [stat] = scatter3Plot()
|
|
stat.description = 'Scatter3 plot with MATLAB(R) stat.';
|
|
|
|
[x,y,z] = sphere(16);
|
|
X = [x(:)*.5 x(:)*.75 x(:)];
|
|
Y = [y(:)*.5 y(:)*.75 y(:)];
|
|
Z = [z(:)*.5 z(:)*.75 z(:)];
|
|
S = repmat([1 .75 .5]*10,numel(x),1);
|
|
C = repmat([1 2 3],numel(x),1);
|
|
scatter3(X(:),Y(:),Z(:),S(:),C(:),'filled'), view(-60,60)
|
|
view(40,35)
|
|
end
|
|
% =========================================================================
|
|
function [stat] = spherePlot()
|
|
stat.description = 'Stretched sphere with unequal axis limits.';
|
|
stat.issues = 560;
|
|
|
|
sphere(30);
|
|
title('a sphere: x^2+y^2+z^2');
|
|
xlabel('x');
|
|
ylabel('y');
|
|
zlabel('z');
|
|
set(gca,'DataAspectRatio',[1,1,.5],'xlim',[-1 2], 'zlim',[-1 0.8])
|
|
end
|
|
% =========================================================================
|
|
function [stat] = surfPlot()
|
|
stat.description = 'Surface plot.';
|
|
|
|
[X,Y,Z] = peaks(30);
|
|
surf(X,Y,Z)
|
|
colormap hsv
|
|
axis([-3 3 -3 3 -10 5])
|
|
set(gca,'View',[-37.5,36]);
|
|
|
|
hc = colorbar('YTickLabel', ...
|
|
{'Freezing','Cold','Cool','Neutral',...
|
|
'Warm','Hot','Burning','Nuclear'});
|
|
set(get(hc,'Xlabel'),'String','Multitude');
|
|
set(get(hc,'Ylabel'),'String','Magnitude');
|
|
set(hc,'YTick',0:0.7:7);
|
|
set(hc,'YTickLabel',...
|
|
{'-0.8' '-0.6' '-0.4' '-0.2' '0.0' ...
|
|
'0.2' '0.4' '0.6' '0.8' '0.10' '0.12'});
|
|
|
|
set(get(hc,'Title'),...
|
|
'String', 'k(u,v)', ...
|
|
'FontSize', 12, ...
|
|
'interpreter', 'tex');
|
|
|
|
xlabel( 'x' )
|
|
ylabel( 'y' )
|
|
zlabel( 'z' )
|
|
end
|
|
% =========================================================================
|
|
function [stat] = surfPlot2()
|
|
stat.description = 'Another surface plot.';
|
|
stat.unreliable = isMATLAB || isOctave; % FIXME: investigate
|
|
|
|
z = [ ones(15, 5) zeros(15,5);
|
|
zeros(5, 5) zeros( 5,5)];
|
|
|
|
surf(abs(fftshift(fft2(z))) + 1);
|
|
set(gca,'ZScale','log');
|
|
|
|
legend( 'legendary', 'Location', 'NorthEastOutside' );
|
|
end
|
|
% =========================================================================
|
|
function [stat] = superkohle()
|
|
stat.description = 'Superkohle plot.';
|
|
stat.unreliable = isMATLAB('<=', [8,3]); %FIXME: broken since decd496 (mac vs linux)
|
|
|
|
if ~exist('initmesh')
|
|
fprintf( 'initmesh() not found. Skipping.\n\n' );
|
|
stat.skip = true;
|
|
return;
|
|
end
|
|
|
|
x1=0;
|
|
x2=pi;
|
|
y1=0;
|
|
y2=pi;
|
|
omegashape = [2 2 2 2 % 2 = line segment; 1 = circle segment; 4 = elipse segment
|
|
x1 x2 x2 x1 % start point x
|
|
x2 x2 x1 x1 % end point x
|
|
y1 y1 y2 y2 % start point y
|
|
y1 y2 y2 y1 % end point y
|
|
1 1 1 1
|
|
0 0 0 0];
|
|
[xy,edges,tri] = initmesh(omegashape,'Hgrad',1.05);
|
|
mmin = 1;
|
|
while size(xy,2) < mmin
|
|
[xy,edges,tri] = refinemesh(omegashape,xy,edges,tri);
|
|
end
|
|
m = size(xy,2);
|
|
x = xy(1,:)';
|
|
y = xy(2,:)';
|
|
y0 = cos(x).*cos(y);
|
|
|
|
pdesurf(xy,tri,y0(:,1));
|
|
title('y_0');
|
|
xlabel('x1 axis');
|
|
ylabel('x2 axis');
|
|
axis([0 pi 0 pi -1 1]);
|
|
grid on;
|
|
end
|
|
% =========================================================================
|
|
function [stat] = meshPlot()
|
|
stat.description = 'Mesh plot.';
|
|
|
|
[X,Y,Z] = peaks(30);
|
|
mesh(X,Y,Z)
|
|
colormap hsv
|
|
axis([-3 3 -3 3 -10 5])
|
|
|
|
xlabel( 'x' )
|
|
ylabel( 'y' )
|
|
zlabel( 'z' )
|
|
end
|
|
% =========================================================================
|
|
function [stat] = ylabels()
|
|
stat.description = 'Separate y-labels.';
|
|
|
|
x = 0:.01:2*pi;
|
|
H = plotyy(x,sin(x),x,3*cos(x));
|
|
|
|
ylabel(H(1),'sin(x)');
|
|
ylabel(H(2),'3cos(x)');
|
|
|
|
xlabel(H(1),'time');
|
|
end
|
|
% =========================================================================
|
|
function [stat] = spectro()
|
|
stat.description = 'Spectrogram plot';
|
|
stat.unreliable = isMATLAB('<', [8,4]); % FIXME: investigate
|
|
|
|
% In the original test case, this is 0:0.001:2, but that takes forever
|
|
% for LaTeX to process.
|
|
if isempty(which('chirp'))
|
|
fprintf( 'chirp() not found. Skipping.\n\n' );
|
|
stat.description = [];
|
|
stat.skip = true;
|
|
return
|
|
end
|
|
|
|
T = 0:0.005:2;
|
|
X = chirp(T,100,1,200,'q');
|
|
spectrogram(X,128,120,128,1E3);
|
|
title('Quadratic Chirp');
|
|
end
|
|
% =========================================================================
|
|
function [stat] = mixedBarLine()
|
|
stat.description = 'Mixed bar/line plot.';
|
|
stat.unreliable = isOctave; %FIXME: investigate (octave of egon)
|
|
% unreliable, see issue #614 (comment 92263263)
|
|
|
|
data = ACID_data;
|
|
x = data(:);
|
|
hist(x,10)
|
|
y = ylim;
|
|
hold on;
|
|
plot([mean(x) mean(x)], y, '-r');
|
|
hold off;
|
|
end
|
|
% =========================================================================
|
|
function [stat] = decayingharmonic()
|
|
stat.description = 'Decaying harmonic oscillation with \TeX{} title.';
|
|
stat.issues = 587;
|
|
|
|
% Based on an example from
|
|
% http://www.mathworks.com/help/techdoc/creating_plots/f0-4741.html#f0-28104
|
|
A = 0.25;
|
|
alpha = 0.007;
|
|
beta = 0.17;
|
|
t = 0:901;
|
|
y = A * exp(-alpha*t) .* sin(beta*t);
|
|
plot(t, y)
|
|
title('{\itAe}^{-\alpha\itt}sin\beta{\itt}, \alpha<<\beta, \beta>>\alpha, \alpha<\beta, \beta>\alpha, b>a')
|
|
xlabel('Time \musec.')
|
|
ylabel('Amplitude |X|')
|
|
end
|
|
% =========================================================================
|
|
function [stat] = texcolor()
|
|
stat.description = 'Multi-colored text using \TeX{} commands.';
|
|
|
|
% Taken from an example at
|
|
% http://www.mathworks.com/help/techdoc/creating_plots/f0-4741.html#f0-28104
|
|
text(.1, .5, ['\fontsize{16}black {\color{magenta}magenta '...
|
|
'\color[rgb]{0 .5 .5}teal \color{red}red} black again'])
|
|
end
|
|
% =========================================================================
|
|
function [stat] = textext()
|
|
stat.description = 'Formatted text and special characters using \TeX{}.';
|
|
|
|
% Taken from an example at
|
|
% http://www.mathworks.com/help/techdoc/creating_plots/f0-4741.html#f0-28303
|
|
txstr(1) = { 'Each cell is a quoted string' };
|
|
txstr(2) = { 'You can specify how the string is aligned' };
|
|
txstr(3) = { 'You can use LaTeX symbols like \pi \chi \Xi' };
|
|
txstr(4) = { '\bfOr use bold \rm\itor italic font\rm' };
|
|
txstr(5) = { '\fontname{courier}Or even change fonts' };
|
|
txstr(5) = { 'and use umlauts like äöüßÄÖÜ and accents éèêŐőŰűç' };
|
|
plot( 0:6, sin(0:6) )
|
|
text( 5.75, sin(2.5), txstr, 'HorizontalAlignment', 'right' )
|
|
end
|
|
% =========================================================================
|
|
function [stat] = texrandom()
|
|
stat.description = 'Random TeX symbols';
|
|
|
|
try
|
|
rng(42); %fix seed
|
|
%TODO: fully test tex conversion instead of a random subsample!
|
|
catch
|
|
rand('seed', 42); %#ok (this is deprecated in MATLAB)
|
|
end
|
|
|
|
num = 20; % number of symbols per line
|
|
symbols = {'\it', '\bf', '\rm', '\sl', ...
|
|
'\alpha', '\angle', '\ast', '\beta', '\gamma', '\delta', ...
|
|
'\epsilon', '\zeta', '\eta', '\theta', '\vartheta', ...
|
|
'\iota', '\kappa', '\lambda', '\mu', '\nu', '\xi', '\pi', ...
|
|
'\rho', '\sigma', '\varsigma', '\tau', '\equiv', '\Im', ...
|
|
'\otimes', '\cap', '{\int}', '\rfloor', '\lfloor', '\perp',...
|
|
'\wedge', '\rceil', '\vee', '\langle', '\upsilon', '\phi', ...
|
|
'\chi', '\psi', '\omega', '\Gamma', '\Delta', '\Theta', ...
|
|
'\Lambda', '\Xi', '\Pi', '\Sigma', '\Upsilon', '\Phi', ...
|
|
'\Psi', '\Omega', '\forall', '\exists', '\ni', '{\cong}', ...
|
|
'\approx', '\Re', '\oplus', '\cup', '\subseteq', '\lceil', ...
|
|
'\cdot', '\neg', '\times', '\surd', '\varpi', '\rangle', ...
|
|
'\sim', '\leq', '\infty', '\clubsuit', '\diamondsuit', ...
|
|
'\heartsuit', '\spadesuit', '\leftrightarrow', ...
|
|
'\leftarrow', '\Leftarrow', '\uparrow', '\rightarrow', ...
|
|
'\Rightarrow', '\downarrow', '\circ', '\pm', '\geq', ...
|
|
'\propto', '\partial', '\bullet', '\div', '\neq', ...
|
|
'\aleph', '\wp', '\oslash', '\supseteq', '\nabla', ...
|
|
'{\ldots}', '\prime', '\0', '\mid', '\copyright', ...
|
|
'\o', '\in', '\subset', '\supset', ...
|
|
'\_', '\^', '\{', '\}', '$', '%', '#', ...
|
|
'(', ')', '+', '-', '=', '/', ',', '.', '<', '>', ...
|
|
'!', '?', ':', ';', '*', '[', ']', '§', '"', '''', ...
|
|
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ...
|
|
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', ...
|
|
'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', ...
|
|
'w', 'x', 'y', 'z', ...
|
|
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', ...
|
|
'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', ...
|
|
'W', 'X', 'Y', 'Z' ...
|
|
};
|
|
% Note: Instead of '\ldots' the list of symbols contains the entry
|
|
% '{\ldots}'. This is because TeX gives an error if it
|
|
% encounters the sequence '$a_\ldots$' or '$a^\ldots$'. It
|
|
% looks like that is a TeX bug. Nevertheless this sequence
|
|
% could appear in the random output, therefore \ldots is
|
|
% wrapped in braces since '$a_{\ldots}$' and '$a^{\ldots}$'
|
|
% don't crash TeX.
|
|
% Same thing with '\cong' and '\int'.
|
|
% \color{red} etc. isn't included
|
|
% \fontname{Times} etc. isn't included
|
|
% \fontsize{12} etc. isn't included
|
|
|
|
switch getEnvironment
|
|
case 'MATLAB'
|
|
% MATLAB expects tilde and ampersand to be un-escaped and backslashes
|
|
% to be escaped
|
|
symbols = [ symbols, {'~', '&', '\\'} ];
|
|
case 'Octave'
|
|
% Octave expects tilde and ampersand to be escaped for regular
|
|
% output. If either are used un-escaped, that creates odd output in
|
|
% Octave itself, but since matlab2tikz should be able to handle
|
|
% those cases, let's include the un-escaped symbols in the list.
|
|
symbols = [ symbols, {'\~', '\&', '~', '&'} ];
|
|
% Octave's backslash handling is weird to say the least. However,
|
|
% matlab2tikz treats backslashes the same in Octave as it does in
|
|
% MATLAB. Therefore, let's add an escaped backslash to the list
|
|
symbols = [ symbols, {'\\'} ];
|
|
otherwise
|
|
error( 'Unknown environment. Need MATLAB(R) or Octave.' )
|
|
end
|
|
|
|
for ypos = [0.9:-.2:.1]
|
|
% Generate `num' random indices to the list of symbols
|
|
index = max(ceil(rand(1, num)*length(symbols)), 1);
|
|
% Assemble symbols into one cell string array
|
|
string = symbols(index);
|
|
|
|
% Add random amount of balanced braces in random positions to `string'.
|
|
% By potentially generating more than one set of braces randomly, it's
|
|
% possible to create more complex patterns of nested braces. Increase
|
|
% `braceprob' to get more braces, but don't use values greater than or
|
|
% equal 1 which would result in an infinite loop.
|
|
braceprob = 0.6;
|
|
while rand(1,1) < braceprob
|
|
% Generate two random numbers ranging from 1 to n with n = number
|
|
% of symbols in `string'
|
|
bracepos = max(ceil(rand(1, 2)*length(string)), 1);
|
|
% Modify `string' so that an opening brace is inserted before
|
|
% min(bracepos) symbols and a closing brace after max(bracepos)
|
|
% symbols. That way any number of symbols from one to all in
|
|
% `string' are wrapped in braces for min(bracepos) == max(bracepos)
|
|
% and min(bracepos) == 1 && max(bracepos) == length(string),
|
|
% respectively.
|
|
string = [string(1:min(bracepos)-1), {'{'}, ...
|
|
string(min(bracepos):max(bracepos)), ...
|
|
{'}'}, string(max(bracepos)+1:end) ];
|
|
end
|
|
% Clean up: remove '{}', '{{}}', etc.
|
|
clean = false;
|
|
while clean == false
|
|
clean = true;
|
|
for i = 1:length(string)-1
|
|
if strcmp( string(i), '{' ) && strcmp( string(i+1), '}' )
|
|
string = [string(1:i-1), string(i+2:end)];
|
|
clean = false;
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
% Subscripts '_' and superscripts '^' in TeX are tricky in that certain
|
|
% combinations are not allowed and there are some subtleties in regard
|
|
% to more complicated combinations of sub/superscripts:
|
|
% - ^a or _a at the beginning of a TeX math expression is permitted.
|
|
% - a^ or a_ at the end of a TeX math expression is not.
|
|
% - a__b, a_^b, a^_b, or a^^b is not allowed, as is any number of
|
|
% consecutive sub/superscript operators. Actually a^^b does not
|
|
% crash TeX, but it produces seemingly random output instead of `b',
|
|
% therefore it should be avoided, too.
|
|
% - a^b^c or a_b_c is not allowed as it results in a "double subscript/
|
|
% superscript" error.
|
|
% - a^b_c or a_b^c, however, does work.
|
|
% - a^bc^d or a_bc_d also works.
|
|
% - a^b_c^d or a_b^c_d is not allowed and results in a "double
|
|
% subscript/superscript" error.
|
|
% - a{_}b, a{^}b, {a_}b or {a^}b is not permitted.
|
|
% - a{_b} or a{^b} is valid TeX code.
|
|
% - {a_b}_c produces the same output as a_{bc}. Likewise for '^'.
|
|
% - a_{b_c} results in "a index b sub-index c". Likewise for '^'.
|
|
% - a^{b}^c or a_{b}_c is not allowed as it results in a "double
|
|
% subscript/superscript" error.
|
|
%
|
|
% From this we can derive a number of rules:
|
|
% 1) The last symbol in a TeX string must not be '^' or '_'.
|
|
% 2a) There must be at least one non-brace symbol between any '^' and '_'.
|
|
% 2b) There must be at least one non-brace symbol between any '_' and '^'.
|
|
% 3a) There must either be at least two non-brace, non-'_' symbols or at
|
|
% least one non-brace, non-'_' symbol and one brace (opening or
|
|
% closing) between any two '^'.
|
|
% 3b) There must either be at least two non-brace, non-'^' symbols or at
|
|
% least one brace (opening or closing) between any two '_'.
|
|
% 4) '^' or '_' must not appear directly before '}'.
|
|
% 5) '^' or '_' must not appear directly after '}'.
|
|
% 6) Whenever braces were mentioned, that refers to non-empty braces,
|
|
% i.e. '{}' counts as nothing. Printable/escaped braces '\{' and '\}'
|
|
% also don't count as braces but as regular symbols.
|
|
% 7) '^' or '_' must not appear directly before '\it', '\bf', '\rm', or
|
|
% '\sl'.
|
|
% 8) '^' or '_' must not appear directly after '\it', '\bf', '\rm', or
|
|
% '\sl'.
|
|
%
|
|
% A few test cases:
|
|
% Permitted: ^a... _a... a^b_c a_b^c a^bc^d a_bc_d a{_b} a{^b}
|
|
% {a_b}_c a_{bc} {a^b}^c a^{bc} a_{b_c} a^{b^c}
|
|
% Forbidden: ...z^ ...z_ a__b a_^b a^_b [a^^b] a^b^c a_b_c
|
|
% a^b_c^d a_b^c_d a{_}b a{^}b {a_}b {a^}b
|
|
% a^{_b} a_{^b} a^{b}^c a_{b}_c
|
|
%
|
|
% Now add sub/superscripts according to these rules
|
|
subsupprob = 0.1; % Probability for insertion of a sub/superscript
|
|
caretdist = Inf; % Distance to the last caret
|
|
underscdist = Inf; % Distance to the last underscore
|
|
bracedist = Inf; % Distance to the last brace (opening or closing)
|
|
pos = 0;
|
|
% Making sure the post-update `pos' in the while loop is less than the
|
|
% number of symbols in `string' enforces rule 1: The last symbol in
|
|
% a TeX string must not be '^' or '_'.
|
|
while pos+1 < length(string)
|
|
% Move one symbol further
|
|
pos = pos + 1;
|
|
% Enforce rule 7: No sub/superscript directly before '\it', '\bf',
|
|
% '\rm', or '\sl'.
|
|
if strcmp( string(pos), '\it' ) || strcmp( string(pos), '\bf' ) ...
|
|
|| strcmp( string(pos), '\rm' ) || strcmp( string(pos), '\sl' )
|
|
continue
|
|
end
|
|
% Enforce rule 8: No sub/superscript directly after '\it', '\bf',
|
|
% '\rm', or '\sl'.
|
|
if (pos > 1) ...
|
|
&& ( strcmp( string(pos-1), '\it' ) ...
|
|
|| strcmp( string(pos-1), '\bf' ) ...
|
|
|| strcmp( string(pos-1), '\rm' ) ...
|
|
|| strcmp( string(pos-1), '\sl' ) ...
|
|
)
|
|
continue
|
|
end
|
|
bracedist = bracedist + 1;
|
|
% Enforce rule 4: No sub/superscript directly before '}'
|
|
if strcmp( string(pos), '}' )
|
|
bracedist = 0; % Also update braces distance
|
|
continue
|
|
end
|
|
% Enforce rule 5: No sub/superscript directly after '}'
|
|
if (pos > 1) && strcmp( string(pos-1), '}' )
|
|
continue
|
|
end
|
|
% Update distances for either braces or caret/underscore depending
|
|
% on whether the symbol currently under scrutiny is a brace or not.
|
|
if strcmp( string(pos), '{' )
|
|
bracedist = 0;
|
|
else
|
|
caretdist = caretdist + 1;
|
|
underscdist = underscdist + 1;
|
|
end
|
|
% Generate two random numbers, then check if any of them is low
|
|
% enough, so that with probability `subsupprob' a sub/superscript
|
|
% operator is inserted into `string' at the current position. In
|
|
% case both random numbers are below the threshold, whether a
|
|
% subscript or superscript operator is to be inserted depends on
|
|
% which of the two numbers is smaller.
|
|
randomnums = rand(1, 2);
|
|
if min(randomnums) < subsupprob
|
|
if randomnums(1) < randomnums(2)
|
|
% Enforce rule 2b: There must be at least one non-brace
|
|
% symbol between previous '_' and to-be-inserted '^'.
|
|
if underscdist < 1
|
|
continue
|
|
end
|
|
% Enforce rule 3a: There must either be at least two
|
|
% non-brace, non-'_' symbols or at least one brace (opening
|
|
% or closing) between any two '^'.
|
|
if ~( ((caretdist >= 2) && (underscdist >= 2)) ...
|
|
|| ((bracedist < 2) && (caretdist >= 2)) )
|
|
continue
|
|
end
|
|
% Insert '^' before `pos'th symbol in `string' now that
|
|
% we've made sure all rules are honored.
|
|
string = [ string(1:pos-1), {'^'}, string(pos:end) ];
|
|
caretdist = 0;
|
|
pos = pos + 1;
|
|
else
|
|
% Enforce rule 2a: There must be at least one non-brace
|
|
% symbol between previous '^' and to-be-inserted '_'.
|
|
if caretdist < 1
|
|
continue
|
|
end
|
|
% Enforce rule 3b: There must either be at least two
|
|
% non-brace, non-'^' symbols or at least one brace (opening
|
|
% or closing) between any two '_'.
|
|
if ~( ((caretdist >= 2) && (underscdist >= 2)) ...
|
|
|| ((bracedist < 2) && (underscdist >= 2)) )
|
|
continue
|
|
end
|
|
% Insert '_' before `pos'th symbol in `string' now that
|
|
% we've made sure all rules are honored.
|
|
string = [ string(1:pos-1), {'_'}, string(pos:end) ];
|
|
underscdist = 0;
|
|
pos = pos + 1;
|
|
end
|
|
end
|
|
end % while pos+1 < length(string)
|
|
|
|
% Now convert the cell string array of symbols into one regular string
|
|
string = [string{:}];
|
|
% Print the string in the figure to be converted by matlab2tikz
|
|
text( .05, ypos, string, 'interpreter', 'tex' )
|
|
% And print it to the console, too, in order to enable analysis of
|
|
% failed tests
|
|
fprintf( 'Original string: %s\n', string )
|
|
end
|
|
|
|
title('Random TeX symbols \\\{\}\_\^$%#&')
|
|
end
|
|
% =========================================================================
|
|
function [stat] = latexInterpreter()
|
|
stat.description = '\LaTeX{} interpreter test (display math not working)';
|
|
stat.issues = 448;
|
|
stat.unreliable = isMATLAB('<=', [8,3]); %FIXME: broken since decd496 (mac vs linux)
|
|
|
|
plot(magic(3),'-x');
|
|
|
|
% Adapted from an example at
|
|
% http://www.mathworks.com/help/techdoc/ref/text_props.html#Interpreter
|
|
text(1.5, 2.0, ...
|
|
'$$\int_0^x\!\int_{\Omega} \mathrm{d}F(u,v) \mathrm{d}\omega$$', ...
|
|
'Interpreter', 'latex', ...
|
|
'FontSize', 26);
|
|
|
|
title(['display math old: $$\alpha$$ and $$\sum_\alpha^\Omega$$; ', ...
|
|
'inline math: $\alpha$ and $\sum_\alpha^\Omega$'],'Interpreter','latex');
|
|
end
|
|
% =========================================================================
|
|
function [stat] = latexmath2()
|
|
stat.description = 'Some nice-looking formulas typeset using the \LaTeX{} interpreter.';
|
|
stat.issues = 637;
|
|
|
|
% Adapted from an example at
|
|
% http://www.mathworks.com/help/techdoc/creating_plots/f0-4741.html#bq558_t
|
|
set(gcf, 'color', 'white')
|
|
set(gcf, 'units', 'inches')
|
|
set(gcf, 'position', [2 2 4 6.5])
|
|
set(gca, 'visible', 'off')
|
|
|
|
% Note: The matrices in h(1) and h(2) cannot be compiled inside pgfplots.
|
|
% They are therefore disabled.
|
|
% h(1) = text( 'units', 'inch', 'position', [.2 5], ...
|
|
% 'fontsize', 14, 'interpreter', 'latex', 'string', ...
|
|
% [ '$$\hbox {magic(3) is } \left( {\matrix{ 8 & 1 & 6 \cr' ...
|
|
% '3 & 5 & 7 \cr 4 & 9 & 2 } } \right)$$' ]);
|
|
% h(2) = text( 'units', 'inch', 'position', [.2 4], ...
|
|
% 'fontsize', 14, 'interpreter', 'latex', 'string', ...
|
|
% [ '$$\left[ {\matrix{\cos(\phi) & -\sin(\phi) \cr' ...
|
|
% '\sin(\phi) & \cos(\phi) \cr}} \right]' ...
|
|
% '\left[ \matrix{x \cr y} \right]$$' ]);
|
|
h(3) = text( 'units', 'inches', 'position', [.2 3], ...
|
|
'fontsize', 14, 'interpreter', 'latex', 'string', ...
|
|
[ '$$L\{f(t)\} \equiv F(s) = \int_0^\infty\!\!{e^{-st}' ...
|
|
'f(t)dt}$$' ]);
|
|
h(4) = text( 'units', 'inches', 'position', [.2 2], ...
|
|
'fontsize', 14, 'interpreter', 'latex', 'string', ...
|
|
'$$e = \sum_{k=0}^\infty {\frac{1}{k!}} $$' );
|
|
h(5) = text( 'units', 'inches', 'position', [.2 1], ...
|
|
'fontsize', 14, 'interpreter', 'latex', 'string', ...
|
|
[ '$$m \ddot y = -m g + C_D \cdot {\frac{1}{2}}' ...
|
|
'\rho {\dot y}^2 \cdot A$$' ]);
|
|
h(6) = text( 'units', 'inches', 'position', [.2 0], ...
|
|
'fontsize', 14, 'interpreter', 'latex', 'string', ...
|
|
'$$\int_{0}^{\infty} x^2 e^{-x^2} dx = \frac{\sqrt{\pi}}{4}$$' );
|
|
end
|
|
% =========================================================================
|
|
function [stat] = parameterCurve3d()
|
|
stat.description = 'Parameter curve in 3D with text boxes in-/outside axis.';
|
|
stat.issues = [378, 790] ;
|
|
t = linspace(0, 20*pi, 1e5);
|
|
plot3(t, sin(t), 50 * cos(t));
|
|
text(0.5, 0.5, 10, 'text inside axis limits');
|
|
text(5.0, 1.5, 50, 'text outside axis (will be removed by cleanfigure())');
|
|
end
|
|
% =========================================================================
|
|
function [stat] = parameterSurf()
|
|
stat.description = 'Parameter and surface plot.';
|
|
stat.unreliable = isMATLAB('<', [8,4]); % FIXME: investigate
|
|
|
|
if ~exist('TriScatteredInterp')
|
|
fprintf( 'TriScatteredInterp() not found. Skipping.\n\n' );
|
|
stat.skip = true;
|
|
return;
|
|
end
|
|
|
|
t = (1:100).';
|
|
t1 = cos(5.75352*t).^2;
|
|
t2 = abs(sin(t));
|
|
|
|
x = t1*4 - 2;
|
|
y = t2*4 - 2;
|
|
z = x.*exp(-x.^2 - y.^2);
|
|
|
|
%TODO: do we really need this TriScatteredInterp?
|
|
% It will be removed from MATLAB
|
|
|
|
% Construct the interpolant
|
|
F = TriScatteredInterp(x,y,z,'linear');
|
|
|
|
% Evaluate the interpolant at the locations (qx, qy), qz
|
|
% is the corresponding value at these locations.
|
|
ti = -2:.25:2;
|
|
[qx,qy] = meshgrid(ti,ti);
|
|
qz = F(qx,qy);
|
|
|
|
hold on
|
|
surf(qx,qy,qz)
|
|
plot3(x,y,z,'o')
|
|
view(gca,[-69 14]);
|
|
hold off
|
|
end
|
|
% =========================================================================
|
|
function [stat] = fill3plot()
|
|
stat.description = 'fill3 plot.';
|
|
|
|
if ~exist('fill3','builtin')
|
|
fprintf( 'fill3() not found. Skipping.\n\n' );
|
|
stat.skip = true;
|
|
return
|
|
end
|
|
|
|
x1 = -10:0.1:10;
|
|
x2 = -10:0.1:10;
|
|
p = sin(x1);
|
|
d = zeros(1,numel(p));
|
|
d(2:2:end) = 1;
|
|
h = p.*d;
|
|
grid on;
|
|
fill3(x1,x2,h,'k');
|
|
view(45,22.5);
|
|
box on;
|
|
end
|
|
% =========================================================================
|
|
function [stat] = rectanglePlot()
|
|
stat.unreliable = isMATLAB('<=', [8,3]); %FIXME: #749 (Jenkins)
|
|
stat.description = 'Rectangle handle.';
|
|
|
|
rectangle('Position', [0.59,0.35,3.75,1.37],...
|
|
'Curvature', [0.8,0.4],...
|
|
'LineWidth', 2, ...
|
|
'LineStyle', '--' ...
|
|
);
|
|
daspect([1,1,1]);
|
|
end
|
|
% =========================================================================
|
|
function [stat] = herrorbarPlot()
|
|
stat.description = 'herrorbar plot.';
|
|
% FIXME: octave is missing the legend
|
|
|
|
hold on;
|
|
X = 1:10;
|
|
Y = 1:10;
|
|
err = repmat(0.2, 1, 10);
|
|
h1 = errorbar(X, Y, err+X/30, 'r');
|
|
h_vec = herrorbar(X, Y, err);
|
|
for h=h_vec
|
|
set(h, 'color', [1 0 0]);
|
|
end
|
|
h2 = errorbar(X, Y+1, err, 'g');
|
|
h_vec = herrorbar(X, Y+1, err+Y/40);
|
|
for h=h_vec
|
|
set(h, 'color', [0 1 0]);
|
|
end
|
|
legend([h1 h2], {'test1', 'test2'})
|
|
end
|
|
% =========================================================================
|
|
function [stat] = hist3d()
|
|
stat.description = '3D histogram plot.';
|
|
|
|
if ~exist('hist3','builtin') && isempty(which('hist3'))
|
|
fprintf( 'Statistics toolbox not found. Skipping.\n\n' );
|
|
stat.skip = true;
|
|
return
|
|
end
|
|
|
|
% load carbig
|
|
% X = [MPG,Weight];
|
|
% hist3(X,[7 7]);
|
|
% xlabel('MPG'); ylabel('Weight');
|
|
% set(get(gca,'child'),'FaceColor','interp','CDataMode','auto');
|
|
|
|
load carbig
|
|
X = [MPG,Weight];
|
|
hist3(X,[7 7]);
|
|
xlabel('MPG'); ylabel('Weight');
|
|
hist3(X,[7 7],'FaceAlpha',.65);
|
|
xlabel('MPG'); ylabel('Weight');
|
|
% Linux crashed with OpenGL.
|
|
%%set(gcf,'renderer','opengl');
|
|
|
|
% load seamount
|
|
% dat = [-y,x]; % Grid corrected for negative y-values
|
|
% n = hist3(dat); % Extract histogram data;
|
|
% % default to 10x10 bins
|
|
% view([-37.5, 30]);
|
|
end
|
|
% =========================================================================
|
|
function [stat] = myBoxplot()
|
|
stat.description = 'Boxplot.';
|
|
stat.unreliable = isMATLAB('<', [8,4]); % R2014a; #552 #414
|
|
|
|
if ~exist('boxplot','builtin') && isempty(which('boxplot'))
|
|
fprintf( 'Statistics toolbox not found. Skipping.\n\n' );
|
|
stat.skip = true;
|
|
return
|
|
end
|
|
|
|
errors =[
|
|
0.810000 3.200000 0.059500
|
|
0.762500 -3.200000 0.455500
|
|
0.762500 4.000000 0.901000
|
|
0.762500 3.600000 0.406000
|
|
0.192500 3.600000 0.307000
|
|
0.810000 -3.600000 0.604000
|
|
1.000000 -2.400000 0.505000
|
|
0.430000 -2.400000 0.455500
|
|
1.000000 3.200000 0.158500
|
|
];
|
|
|
|
boxplot(errors);
|
|
end
|
|
% =========================================================================
|
|
function [stat] = areaPlot()
|
|
stat.description = 'Area plot.';
|
|
|
|
M = magic(5);
|
|
M = M(1:3,2:4);
|
|
h = area(1:3, M);
|
|
legend(h([1,3]),'foo', 'foobar');
|
|
end
|
|
% =========================================================================
|
|
function [stat] = customLegend()
|
|
stat.description = 'Custom legend.';
|
|
stat.unreliable = isMATLAB('<', [8,4]) || isOctave; %FIXME: investigate (Travis differs from Linux/Mac octave)
|
|
|
|
x = -pi:pi/10:pi;
|
|
y = tan(sin(x)) - sin(tan(x));
|
|
plot(x,y,'--rs');
|
|
|
|
lh=legend('y');
|
|
set(lh,'Location','West')
|
|
set(lh,'color','g')
|
|
set(lh,'edgecolor','r')
|
|
set(lh, 'position',[.5 .6 .1 .05])
|
|
end
|
|
% =========================================================================
|
|
function [stat] = pixelLegend()
|
|
stat.description = 'Legend with pixel position.';
|
|
|
|
x = linspace(0,1);
|
|
plot(x, [x;x.^2]);
|
|
set(gca, 'units', 'pixels')
|
|
lh=legend('1', '2');
|
|
set(lh, 'units','pixels','position', [100 200 65 42])
|
|
end
|
|
% =========================================================================
|
|
function [stat] = croppedImage()
|
|
stat.description = 'Custom legend.';
|
|
|
|
if ~exist('flujet.mat','file')
|
|
fprintf( 'flujet data set not found. Skipping.\n\n' );
|
|
stat.skip = true;
|
|
return;
|
|
end
|
|
|
|
load('flujet','X','map');
|
|
image(X)
|
|
colormap(map)
|
|
%axis off
|
|
axis image
|
|
xlim([50 200])
|
|
ylim([50 200])
|
|
% colorbar at top
|
|
colorbar('north');
|
|
set(gca,'Units','normalized');
|
|
end
|
|
% =========================================================================
|
|
function [stat] = pColorPlot()
|
|
stat.description = 'pcolor() plot.';
|
|
|
|
ylim([-1 1]); xlim([-1 1]); hold on; % prevent error on octave
|
|
n = 6;
|
|
r = (0:n)'/n;
|
|
theta = pi*(-n:n)/n;
|
|
X = r*cos(theta);
|
|
Y = r*sin(theta);
|
|
C = r*cos(2*theta);
|
|
pcolor(X,Y,C)
|
|
axis equal tight
|
|
end
|
|
% =========================================================================
|
|
function [stat] = multiplePatches()
|
|
stat.description = 'Multiple patches.';
|
|
|
|
xdata = [2 2 0 2 5;
|
|
2 8 2 4 5;
|
|
8 8 2 4 8];
|
|
ydata = [4 4 4 2 0;
|
|
8 4 6 2 2;
|
|
4 0 4 0 0];
|
|
cdata = [15 0 4 6 10;
|
|
1 2 5 7 9;
|
|
2 3 0 8 3];
|
|
p = patch(xdata,ydata,cdata,'Marker','o',...
|
|
'MarkerFaceColor','flat',...
|
|
'FaceColor','none');
|
|
end
|
|
% =========================================================================
|
|
function [stat] = hgTransformPlot()
|
|
stat.description = 'hgtransform() plot.';
|
|
|
|
if isOctave
|
|
% Octave (3.8.0) has no implementation of `hgtransform`
|
|
stat.skip = true;
|
|
return;
|
|
end
|
|
% Check out
|
|
% http://www.mathworks.de/de/help/matlab/ref/hgtransform.html.
|
|
|
|
ax = axes('XLim',[-2 1],'YLim',[-2 1],'ZLim',[-1 1]);
|
|
view(3);
|
|
grid on;
|
|
axis equal;
|
|
|
|
[x,y,z] = cylinder([.2 0]);
|
|
h(1) = surface(x,y,z,'FaceColor','red');
|
|
h(2) = surface(x,y,-z,'FaceColor','green');
|
|
h(3) = surface(z,x,y,'FaceColor','blue');
|
|
h(4) = surface(-z,x,y,'FaceColor','cyan');
|
|
h(5) = surface(y,z,x,'FaceColor','magenta');
|
|
h(6) = surface(y,-z,x,'FaceColor','yellow');
|
|
|
|
t1 = hgtransform('Parent',ax);
|
|
t2 = hgtransform('Parent',ax);
|
|
|
|
set(h,'Parent',t1);
|
|
h2 = copyobj(h,t2);
|
|
|
|
Txy = makehgtform('translate',[-1.5 -1.5 0]);
|
|
set(t2,'Matrix',Txy)
|
|
drawnow
|
|
end
|
|
% =========================================================================
|
|
function [stat] = logbaseline()
|
|
stat.description = 'Logplot with modified baseline.';
|
|
|
|
bar([0 1 2], [1 1e-2 1e-5],'basevalue', 1e-6);
|
|
set(gca,'YScale','log');
|
|
end
|
|
% =========================================================================
|
|
function [stat] = alphaImage()
|
|
stat.description = 'Images with alpha channel.';
|
|
stat.unreliable = isOctave; %FIXME: investigate
|
|
|
|
subplot(2,1,1);
|
|
title('Scaled Alpha Data');
|
|
N = 20;
|
|
h_imsc = imagesc(repmat(1:N, N, 1));
|
|
mask = zeros(N);
|
|
mask(N/4:3*N/4, N/4:3*N/4) = 1;
|
|
set(h_imsc, 'AlphaData', double(~mask));
|
|
set(h_imsc, 'AlphaDataMapping', 'scaled');
|
|
set(gca, 'ALim', [-1,1]);
|
|
title('');
|
|
|
|
subplot(2,1,2);
|
|
title('Integer Alpha Data');
|
|
N = 2;
|
|
line([0 N]+0.5, [0 N]+0.5, 'LineWidth', 2, 'Color','k');
|
|
line([0 N]+0.5, [N 0]+0.5, 'LineWidth', 2, 'Color','k');
|
|
hold on
|
|
imagesc([0,1;2,3],'AlphaData',uint8([64,128;192,256]))
|
|
end
|
|
% =========================================================================
|
|
function stat = annotationAll()
|
|
stat.description = 'All possible annotations with edited properties';
|
|
stat.unreliable = isMATLAB('<', [8,4]); % TODO: R2014a and older: #604
|
|
|
|
if isempty(which('annotation'))
|
|
fprintf( 'annotation() not found. Skipping.\n\n' );
|
|
stat.skip = true;
|
|
return;
|
|
end
|
|
|
|
% Create plot
|
|
X1 = -5:0.1:5;
|
|
plot(X1,log(X1.^2+1));
|
|
|
|
% Create line
|
|
annotation('line',[0.21 0.26], [0.63 0.76], 'Color',[0.47 0.3 0.44],...
|
|
'LineWidth',4, 'LineStyle',':');
|
|
|
|
% Create arrow
|
|
if isOctave('>=', 4)
|
|
headStyle = 'vback3'; %Octave does not support cback2 yet (2015-09)
|
|
else
|
|
headStyle = 'cback2';
|
|
end
|
|
|
|
annotation('arrow',[0.25 0.22], [0.96 0.05], 'LineStyle','-.',...
|
|
'HeadStyle', headStyle);
|
|
|
|
% Create textarrow
|
|
annotation('textarrow',[0.46 0.35], [0.41 0.50],...
|
|
'Color',[0.92 0.69 0.12], 'TextBackgroundColor',[0.92 0.83 0.83],...
|
|
'String',{'something'}, 'LineWidth',2, 'FontWeight','bold',...
|
|
'FontSize',20, 'FontName','Helvetica');
|
|
|
|
% Create doublearrow
|
|
annotation('doublearrow',[0.33 0.7], [0.56 0.55]);
|
|
|
|
% Create textbox
|
|
annotation('textbox', [0.41 0.69 0.17 0.10], 'String',{'something'},...
|
|
'FitBoxToText','off');
|
|
|
|
% Create ellipse
|
|
if isOctave(4)
|
|
colorSpec = 'EdgeColor';
|
|
else
|
|
colorSpec = 'Color';
|
|
end
|
|
annotation('ellipse', [0.70 0.44 0.15 0.51], ...
|
|
colorSpec, [0.63 0.07 0.18],...
|
|
'LineWidth', 3, 'FaceColor',[0.80 0.87 0.96]);
|
|
|
|
% Create rectangle
|
|
annotation('rectangle', [0.3 0.26 0.53 0.58], 'LineWidth',8,...
|
|
'LineStyle',':');
|
|
end
|
|
% =========================================================================
|
|
function [stat] = annotationSubplots()
|
|
stat.description = 'Annotated and unaligned subplots';
|
|
|
|
if isempty(which('annotation'))
|
|
fprintf( 'annotation() not found. Skipping.\n\n' );
|
|
stat.skip = true;
|
|
return;
|
|
end
|
|
|
|
X1 = 0:0.01:1;
|
|
Y1 = X1.^2;
|
|
Y2 = Y1.^2;
|
|
Y3 = X1.^(1/4);
|
|
|
|
set(gcf, 'Position', [100 100 1500 600]);
|
|
|
|
axes1 = axes('Parent',gcf, 'Position',[0.07 0.4015 0.2488 0.5146]);
|
|
box(axes1,'on');
|
|
hold(axes1,'all');
|
|
|
|
title('f(x)=x^2');
|
|
|
|
plot(X1,Y1,'Parent',axes1, 'DisplayName','(0:0.05:1).^2 vs 0:0.05:1');
|
|
|
|
axes2 = axes('Parent',gcf, 'OuterPosition',[0.4062 0 0.2765 0.6314]);
|
|
box(axes2,'on');
|
|
hold(axes2,'all');
|
|
|
|
plot(X1,Y2,'Parent',axes2,'DisplayName','(0:0.05:1).^4 vs 0:0.05:1');
|
|
|
|
axes3 = axes('Parent',gcf, 'Position',[0.7421 0.3185 0.21 0.5480]);
|
|
box(axes3,'on');
|
|
hold(axes3,'all');
|
|
|
|
plot(X1,Y3,'Parent',axes3,'DisplayName','(0:0.05:1).^(1/4) vs 0:0.05:1');
|
|
|
|
annotation(gcf,'textbox',[0.3667 0.5521 0.0124 0.0393], ...
|
|
'String',{'f^2'}, 'FitBoxToText','off');
|
|
|
|
annotation(gcf,'arrow',[0.3263 0.4281], [0.6606 0.3519]);
|
|
|
|
annotation(gcf,'textarrow',[0.6766 0.7229], [0.3108 0.6333],...
|
|
'TextEdgeColor','none', 'HorizontalAlignment','center', ...
|
|
'String',{'invert'});
|
|
end
|
|
% =========================================================================
|
|
function [stat] = annotationText()
|
|
stat.description = 'Variations of textual annotations';
|
|
stat.unreliable = isMATLAB('<', [8,4]); % FIXME: investigate
|
|
|
|
if ~exist('annotation')
|
|
fprintf( 'annotation() not found. Skipping.\n\n' );
|
|
stat.skip = true;
|
|
return;
|
|
end
|
|
|
|
X1 = -5:0.1:5;
|
|
Y1 = log(X1.^2+1);
|
|
|
|
% Resize figure to fit all text inside
|
|
set(gcf,'Position', [100 100 1000 700]);
|
|
|
|
% Otherwise the axes is plotted wrongly
|
|
drawnow();
|
|
|
|
% Create axes
|
|
axes1 = axes('Parent',gcf);
|
|
hold(axes1,'all');
|
|
|
|
% Create plot
|
|
plot(X1,Y1);
|
|
|
|
% Create text
|
|
text('Parent',axes1,'String',' \leftarrow some point on the curve',...
|
|
'Position',[-2.01811125485123 1.5988219895288 7.105427357601e-15]);
|
|
|
|
% Create text
|
|
text('Parent',axes1,'String','another point \rightarrow',...
|
|
'Position',[1 0.693147180559945 0],...
|
|
'HorizontalAlignment','right');
|
|
|
|
% Create textbox
|
|
annotation(gcf,'textbox',...
|
|
[0.305611222444885 0.292803442287824 0.122244488977956 0.0942562592047128],...
|
|
'String',{'This boxes size','should adjust to','the text size'});
|
|
|
|
% Create textbox
|
|
annotation(gcf,'textbox',...
|
|
[0.71643086172344 0.195876288659794 0.10020240480962 0.209240982129118],...
|
|
'String',{'Multiple Lines due to fixed width'},...
|
|
'FitBoxToText','off');
|
|
|
|
% Create textbox
|
|
annotation(gcf,'textbox',...
|
|
[0.729456913827655 0.608247422680412 0.0851723446893787 0.104257797902974],...
|
|
'String',{'Overlapping','and italic'},...
|
|
'FontAngle','italic',...
|
|
'FitBoxToText','off',...
|
|
'BackgroundColor',[0.756862759590149 0.866666674613953 0.776470601558685]);
|
|
|
|
% Create textbox
|
|
annotation(gcf,'textbox',...
|
|
[0.420000437011093 0.680170575692964 0.155149863590109 0.192171438527209],...
|
|
'VerticalAlignment','middle',...
|
|
'String',{'Text with a','thick and','dotted','border'},...
|
|
'HorizontalAlignment','center',...
|
|
'FitBoxToText','off',...
|
|
'LineStyle',':',...
|
|
'LineWidth',4);
|
|
|
|
% Create textarrow
|
|
annotation(gcf,'textarrow',[0.21943887775551 0.2625250501002],...
|
|
[0.371002132196162 0.235640648011782],'TextEdgeColor','none',...
|
|
'TextBackgroundColor',[0.678431391716003 0.921568632125854 1],...
|
|
'TextRotation',30,...
|
|
'VerticalAlignment','bottom',...
|
|
'HorizontalAlignment','center',...
|
|
'String',{'Rotated Text'});
|
|
|
|
% Create textarrow
|
|
annotation(gcf,'textarrow',[0.238436873747493 0.309619238476953],...
|
|
[0.604315828808828 0.524300441826215],'TextEdgeColor','none',...
|
|
'TextColor',[1 1 1],...
|
|
'TextBackgroundColor',[0 0 1],...
|
|
'TextRotation',30,...
|
|
'VerticalAlignment','bottom',...
|
|
'HorizontalAlignment','center',...
|
|
'String',{'Rotated Text 2'},...
|
|
'HeadStyle','diamond',...
|
|
'Color',[1 0 0]);
|
|
end
|
|
% =========================================================================
|
|
function [stat] = annotationTextUnits()
|
|
stat.description = 'Text with changed Units';
|
|
stat.unreliable = isMATLAB('<', [8,4]); % FIXME: investigate
|
|
|
|
if ~exist('annotation')
|
|
fprintf( 'annotation() not found. Skipping.\n\n' );
|
|
stat.skip = true;
|
|
return;
|
|
end
|
|
|
|
X1 = -5:0.1:5;
|
|
Y1 = log(X1.^2+1);
|
|
|
|
% Resize figure to fit all text inside
|
|
set(gcf,'Units', 'inches');
|
|
set(gcf,'Position', [1.03125, 1.03125, 10.416666666666666, 7.291666666666666 ]);
|
|
|
|
% Otherwise the axes is plotted wrongly
|
|
drawnow();
|
|
|
|
% Create axes
|
|
axes1 = axes('Parent',gcf,'Units','centimeters',...
|
|
'Position',[3.4369697916666664, 2.035743645833333 20.489627604166664 15.083009739583332]);
|
|
hold(axes1,'all');
|
|
|
|
% Create plot
|
|
plot(X1,Y1);
|
|
|
|
% Create text
|
|
text('Parent',axes1,'Units','normalized',...
|
|
'String',' \leftarrow some point on the curve',...
|
|
'Position',[0.295865633074935 0.457364341085271 0]);
|
|
|
|
% Create text
|
|
text('Parent',axes1,'Units','centimeters',...
|
|
'String','another point \rightarrow',...
|
|
'Position',[12.2673383333333 2.98751989583333 0],...
|
|
'HorizontalAlignment','right');
|
|
|
|
% Create textbox
|
|
annotation(gcf,'textbox',...
|
|
[0.305611222444885 0.292803442287824 0.122244488977956 0.0942562592047128],...
|
|
'String',{'This boxes size','should adjust to','the text size'},...
|
|
'FitBoxToText','off',...
|
|
'Units','pixels');
|
|
|
|
|
|
% Create textarrow
|
|
annotation(gcf,'textarrow',[0.21943887775551 0.2625250501002],...
|
|
[0.371002132196162 0.235640648011782],'TextEdgeColor','none',...
|
|
'TextBackgroundColor',[0.678431391716003 0.921568632125854 1],...
|
|
'TextRotation',30,...
|
|
'HorizontalAlignment','center',...
|
|
'String',{'Rotated Text'},...
|
|
'Units','points');
|
|
|
|
% Create textarrow
|
|
annotation(gcf,'textarrow',[0.238436873747493 0.309619238476953],...
|
|
[0.604315828808828 0.524300441826215],'TextEdgeColor','none',...
|
|
'TextColor',[1 1 1],...
|
|
'TextBackgroundColor',[0 0 1],...
|
|
'TextRotation',30,...
|
|
'HorizontalAlignment','center',...
|
|
'String',{'Rotated Text 2'},...
|
|
'HeadStyle','diamond',...
|
|
'Color',[1 0 0]);
|
|
|
|
% Create textbox
|
|
if ~isOctave(4)
|
|
annotation(gcf,'textbox',...
|
|
[0.71643086172344 0.195876288659794 0.10020240480962 0.209240982129118],...
|
|
'String',{'Multiple Lines due to fixed width'},...
|
|
'FitBoxToText','off',...
|
|
'Units','characters');
|
|
else
|
|
% Octave 4 doesn't seem to like the "'Units','Characters'" in there
|
|
% so just remove the object altogether.
|
|
% This is strange, since it is documented: https://www.gnu.org/software/octave/doc/interpreter/Plot-Annotations.html#Plot-Annotations
|
|
end
|
|
|
|
% Create textbox
|
|
annotation(gcf,'textbox',...
|
|
[0.420000437011093 0.680170575692964 0.155149863590109 0.192171438527209],...
|
|
'VerticalAlignment','middle',...
|
|
'String',{'Text with a','thick and','dotted','border'},...
|
|
'HorizontalAlignment','center',...
|
|
'FitBoxToText','off',...
|
|
'LineStyle',':',...
|
|
'LineWidth',4);
|
|
|
|
% Create textbox
|
|
annotation(gcf,'textbox',...
|
|
[0.729456913827655 0.608247422680412 0.0851723446893787 0.104257797902974],...
|
|
'String',{'Overlapping','and italic'},...
|
|
'FontAngle','italic',...
|
|
'FitBoxToText','off',...
|
|
'BackgroundColor',[0.756862759590149 0.866666674613953 0.776470601558685]);
|
|
end
|
|
% =========================================================================
|
|
function [stat] = imageOrientation_inline()
|
|
% Run test and save pictures as inline TikZ code
|
|
[stat] = imageOrientation(false);
|
|
stat.unreliable = isOctave; % FIXME
|
|
end
|
|
function [stat] = imageOrientation_PNG()
|
|
% Run test and save pictures as external PNGs
|
|
[stat] = imageOrientation(true);
|
|
stat.unreliable = isOctave; % FIXME
|
|
end
|
|
function [stat] = imageOrientation(imagesAsPng)
|
|
% Parameter 'imagesAsPng' is boolean
|
|
stat.description = ['Systematic test of different axis', ...
|
|
' orientations and visibility (imagesAsPng = ', ...
|
|
num2str(imagesAsPng), ').'];
|
|
stat.extraOptions = {'imagesAsPng', imagesAsPng};
|
|
|
|
data = magic(3);
|
|
data = [[0,0,9]; data]; % ensure non-quadratic matrix
|
|
|
|
subplot(3,2,1);
|
|
imagesc(data); colormap(hot);
|
|
set(gca,'XDir','normal');
|
|
xlabel('XDir normal');
|
|
set(gca,'YDir','normal');
|
|
ylabel('YDir normal');
|
|
|
|
subplot(3,2,2);
|
|
imagesc(data); colormap(hot);
|
|
set(gca,'XDir','reverse');
|
|
xlabel('XDir reverse');
|
|
set(gca,'YDir','normal');
|
|
ylabel('YDir normal');
|
|
|
|
subplot(3,2,3);
|
|
imagesc(data); colormap(hot);
|
|
set(gca,'XDir','normal');
|
|
xlabel('XDir normal');
|
|
set(gca,'YDir','reverse');
|
|
ylabel('YDir reverse');
|
|
|
|
subplot(3,2,4);
|
|
imagesc(data); colormap(hot);
|
|
set(gca,'XDir','reverse');
|
|
xlabel('XDir reverse');
|
|
set(gca,'YDir','reverse');
|
|
ylabel('YDir reverse');
|
|
|
|
subplot(3,2,5);
|
|
imagesc(data); colormap(hot);
|
|
set(gca,'XDir','normal');
|
|
xlabel('XDir normal');
|
|
set(gca,'YDir','reverse');
|
|
ylabel('YDir reverse');
|
|
axis off;
|
|
title('like above, but axis off');
|
|
|
|
subplot(3,2,6);
|
|
imagesc(data); colormap(hot);
|
|
set(gca,'XDir','reverse');
|
|
xlabel('XDir reverse');
|
|
set(gca,'YDir','reverse');
|
|
ylabel('YDir reverse');
|
|
axis off;
|
|
title('like above, but axis off');
|
|
end
|
|
% =========================================================================
|
|
function [stat] = texInterpreter()
|
|
stat.description = 'Combinations of tex commands';
|
|
axes
|
|
text(0.1,0.9, {'\bfBold text before \alpha and also afterwards.', 'Even the next line is bold \itand a bit italic.'});
|
|
text(0.1,0.75, {'Changing \bfthe\fontname{Courier} font or \color[rgb]{0,0.75,0}color doesn''t', 'change the style. Resetting \rmthe style', 'doesn''t change the font or color.'});
|
|
text(0.1,0.6, 'Styles can be {\bflimited} using \{ and \}.');
|
|
text(0.1,0.45, {'But what happens to the output if there is', '{\bfuse an \alpha inside} the limitted style.'});
|
|
text(0.1,0.3, 'Or if the\fontsize{14} size\color{red} and color are \fontsize{10}changed at different\color{blue} points.');
|
|
text(0.1,0.15, {'Also_{some \bf subscripts} and^{superscripts} are possible.', 'Without brackets, it l^o_oks like t_his.' });
|
|
end
|
|
% =========================================================================
|
|
function [stat] = stackedBarsWithOther()
|
|
stat.description = 'stacked bar plots and other plots';
|
|
stat.issues = [442,648];
|
|
stat.unreliable = isOctave || isMATLAB(); % FIXME: #614
|
|
% details: https://github.com/matlab2tikz/matlab2tikz/pull/614#issuecomment-91844506
|
|
|
|
% dataset stacked
|
|
data = ACID_data;
|
|
Y = round(abs(data(7:-1:3,1:3))/10);
|
|
n = size(Y,1);
|
|
xVals = (1:n).';
|
|
yVals = min((xVals).^2, sum(Y,2));
|
|
|
|
subplot(2,1,1); hold on;
|
|
bar(Y,'stacked');
|
|
plot(xVals, yVals, 'Color', 'r', 'LineWidth', 2);
|
|
legend('show');
|
|
|
|
subplot(2,1,2); hold on;
|
|
b2 = barh(Y,'stacked','BarWidth', 0.75);
|
|
plot(yVals, xVals, 'Color', 'b', 'LineWidth', 2);
|
|
|
|
set(b2(1),'FaceColor','c','EdgeColor','none')
|
|
end
|
|
% =========================================================================
|
|
function [stat] = colorbarLabelTitle()
|
|
stat.description = 'colorbar with label and title';
|
|
stat.unreliable = isOctave; %FIXME: investigate
|
|
stat.issues = 429;
|
|
|
|
% R2014b handles colorbars smart: `XLabel` and `YLabel` merged into `Label`
|
|
% Use colormap 'jet' to create comparable output with MATLAB R2014b
|
|
% * Check horizontal/vertical colorbar (subplots)
|
|
% * Check if 'direction' is respected
|
|
% * Check if multiline label and title works
|
|
% * Check if latex interpreter works in label and title
|
|
|
|
subplot(1,2,1)
|
|
imagesc(magic(3));
|
|
hc = colorbar;
|
|
colormap('jet');
|
|
title(hc,'title $\beta$','Interpreter','latex');
|
|
ylabel(hc,'label $a^2$','Interpreter','latex');
|
|
set(hc,'YDir','reverse');
|
|
|
|
subplot(1,2,2)
|
|
label_multiline = {'first','second','third'};
|
|
title_multiline = {'title 1','title 2'};
|
|
imagesc(magic(3));
|
|
hc = colorbar('southoutside');
|
|
colormap('jet');
|
|
title(hc,title_multiline);
|
|
xlabel(hc,label_multiline);
|
|
end
|
|
% =========================================================================
|
|
function [stat] = textAlignment()
|
|
stat.description = 'alignment of text boxes and position relative to axis';
|
|
stat.issues = 378;
|
|
stat.unreliable = isOctave; %FIXME: investigate
|
|
|
|
plot([0.0 2.0], [1.0 1.0],'k'); hold on;
|
|
plot([0.0 2.0], [0.5 0.5],'k');
|
|
plot([0.0 2.0], [1.5 1.5],'k');
|
|
plot([1.0 1.0], [0.0 2.0],'k');
|
|
plot([1.5 1.5], [0.0 2.0],'k');
|
|
plot([0.5 0.5], [0.0 2.0],'k');
|
|
|
|
text(1.0,1.0,'h=c, v=m', ...
|
|
'HorizontalAlignment','center','VerticalAlignment','middle');
|
|
text(1.5,1.0,'h=l, v=m', ...
|
|
'HorizontalAlignment','left','VerticalAlignment','middle');
|
|
text(0.5,1.0,'h=r, v=m', ...
|
|
'HorizontalAlignment','right','VerticalAlignment','middle');
|
|
|
|
text(0.5,1.5,'h=r, v=b', ...
|
|
'HorizontalAlignment','right','VerticalAlignment','bottom');
|
|
text(1.0,1.5,'h=c, v=b', ...
|
|
'HorizontalAlignment','center','VerticalAlignment','bottom');
|
|
text(1.5,1.5,'h=l, v=b', ...
|
|
'HorizontalAlignment','left','VerticalAlignment','bottom');
|
|
|
|
text(0.5,0.5,'h=r, v=t', ...
|
|
'HorizontalAlignment','right','VerticalAlignment','top');
|
|
text(1.0,0.5,'h=c, v=t', ...
|
|
'HorizontalAlignment','center','VerticalAlignment','top');
|
|
h_t = text(1.5,0.5,{'h=l, v=t','multiline'}, ...
|
|
'HorizontalAlignment','left','VerticalAlignment','top');
|
|
set(h_t,'BackgroundColor','g');
|
|
|
|
text(0.5,2.1, 'text outside axis (will be removed by cleanfigure())');
|
|
text(1.8,0.7, {'text overlapping', 'axis limits'});
|
|
text(-0.2,0.7, {'text overlapping', 'axis limits'});
|
|
text(0.9,0.0, {'text overlapping', 'axis limits'});
|
|
h_t = text(0.9,2.0, {'text overlapping', 'axis limits'});
|
|
|
|
% Set different units to test if they are properly handled
|
|
set(h_t, 'Units', 'centimeters');
|
|
end
|
|
% =========================================================================
|
|
function [stat] = overlappingPlots()
|
|
stat.description = 'Overlapping plots with zoomed data and varying background.';
|
|
stat.unreliable = isMATLAB();
|
|
% FIXME: this test is unreliable because the automatic axis limits of `ax2`
|
|
% differ on different test platforms. Reckon this by creating the figure
|
|
% using `ACID(97)` and then manually slightly modify the window size.
|
|
% We should not set the axis limits explicitly rather find a better way.
|
|
% Workaround: Slightly adapt width and height of `ax2`.
|
|
% #591, #641 (issuecomment-106241711)
|
|
stat.issues = 6;
|
|
|
|
% create pseudo random data and convert it from matrix to vector
|
|
l = 256;
|
|
l_zoom = 64;
|
|
wave = sin(linspace(1,10*2*pi,l));
|
|
|
|
% plot data
|
|
ax1 = axes();
|
|
plot(ax1, wave);
|
|
|
|
% overlapping plots with zoomed data
|
|
ax3 = axes('Position', [0.2, 0.6, 0.3, 0.4]);
|
|
ax4 = axes('Position', [0.7, 0.2, 0.2, 0.4]);
|
|
ax2 = axes('Position', [0.25, 0.3, 0.3, 0.4]);
|
|
|
|
plot(ax2, 1:l_zoom, wave(1:l_zoom), 'r');
|
|
plot(ax3, 1:l_zoom, wave(1:l_zoom), 'k');
|
|
plot(ax4, 1:l_zoom, wave(1:l_zoom), 'k');
|
|
|
|
% set x-axis limits of main plot and first subplot
|
|
xlim(ax1, [1,l]);
|
|
xlim(ax3, [1,l_zoom]);
|
|
|
|
% axis background color: ax2 = default, ax3 = green, ax4 = transparent
|
|
set(ax3, 'Color', 'green');
|
|
set(ax4, 'Color', 'none');
|
|
end
|
|
% =========================================================================
|
|
function [stat] = histogramPlot()
|
|
if isOctave || isMATLAB('<', [8,4])
|
|
% histogram() was introduced in Matlab R2014b.
|
|
% TODO: later replace by 'isHG2()'
|
|
fprintf('histogram() not found. Skipping.\n' );
|
|
stat.skip = true;
|
|
return;
|
|
end
|
|
stat.description = 'overlapping histogram() plots and custom size bins';
|
|
stat.issues = 525;
|
|
|
|
x = [-0.2, -0.484, 0.74, 0.632, -1.344, 0.921, -0.598, -0.727,...
|
|
-0.708, 1.045, 0.37, -1.155, -0.807, 1.027, 0.053, 0.863,...
|
|
1.131, 0.134, -0.017, -0.316];
|
|
y = x.^2;
|
|
edges = [-2 -1:0.25:3];
|
|
histogram(x,edges);
|
|
hold on
|
|
h = histogram(y);
|
|
set(h, 'orientation', 'horizontal');
|
|
end
|
|
% =========================================================================
|
|
function [stat] = alphaTest()
|
|
stat.description = 'overlapping objects with transparency and other properties';
|
|
stat.issues = 593;
|
|
|
|
contourf(peaks(5)); hold on; % background
|
|
|
|
% rectangular patch with different properties
|
|
h = fill([2 2 4 4], [2 3 3 2], 'r');
|
|
set(h, 'FaceColor', 'r');
|
|
set(h, 'FaceAlpha', 0.2);
|
|
set(h, 'EdgeColor', 'g');
|
|
set(h, 'EdgeAlpha', 0.4);
|
|
set(h, 'LineStyle', ':');
|
|
set(h, 'LineWidth', 4);
|
|
set(h, 'Marker', 'x');
|
|
set(h, 'MarkerSize', 16);
|
|
set(h, 'MarkerEdgeColor', [1 0.5 0]);
|
|
set(h, 'MarkerFaceColor', [1 0 0]); % has no visual effect
|
|
|
|
% line with different properties
|
|
h = line([3 3.5], [1.5 3.5]);
|
|
set(h, 'Color', [1 1 1]);
|
|
if isMATLAB('>=', [8,4])
|
|
% TODO: later replace by 'isHG2()'
|
|
fprintf('Note: RGBA (with alpha channel) only in HG2.\n' );
|
|
set(h, 'Color', [1 1 1 0.3]);
|
|
end
|
|
set(h, 'LineStyle', ':');
|
|
set(h, 'LineWidth', 6);
|
|
set(h, 'Marker', 'o');
|
|
set(h, 'MarkerSize', 14);
|
|
set(h, 'MarkerEdgeColor', [1 1 0]);
|
|
set(h, 'MarkerFaceColor', [1 0 0]);
|
|
end
|
|
% =========================================================================
|
|
function [stat] = removeOutsideMarker()
|
|
stat.description = 'remove markers outside of the box';
|
|
stat.issues = 788;
|
|
|
|
% Create the data and plot it
|
|
xdata = -1 : 0.5 : 1.5;
|
|
ydata_marker = 1.5 * ones(size(xdata));
|
|
ydata_line = 1 * ones(size(xdata));
|
|
ydata_combined = 0.5 * ones(size(xdata));
|
|
plot(xdata, ydata_marker, '*', ...
|
|
xdata, ydata_line, '-', ...
|
|
xdata, ydata_combined, '*-');
|
|
title('Markers at -1 and 0.5 should be removed, the line shortened');
|
|
|
|
% Change the limits, so one marker is outside the box
|
|
ylim([0, 2]);
|
|
xlim([0, 2]);
|
|
|
|
% Remove it
|
|
cleanfigure;
|
|
|
|
% Change the limits back to check result
|
|
xlim([-1, 2]);
|
|
end
|
|
% =========================================================================
|
|
function [stat] = colorbars()
|
|
stat.description = 'Manual positioning of colorbars';
|
|
stat.issues = [933 937];
|
|
stat.unreliable = isOctave(); %FIXME: positions differ between Octave 3.2 and 4.0.
|
|
|
|
shift = [0.2 0.8 0.2 0.8];
|
|
axLoc = {'in','out','out','in'};
|
|
|
|
for iAx = 1:4
|
|
hAx(iAx) = subplot(2,2,iAx);
|
|
axPos = get(hAx(iAx), 'Position');
|
|
cbPos = [axPos(1)+shift(iAx)*axPos(3), axPos(2), 0.02, 0.2];
|
|
|
|
hCb(iAx) = colorbar('Position', cbPos);
|
|
try
|
|
% only in HG2
|
|
set(hCb(iAx), 'AxisLocation', axLoc{iAx});
|
|
end
|
|
title(['AxisLocation = ' axLoc{iAx}]);
|
|
grid('on');
|
|
end
|
|
end
|
|
% =========================================================================
|
|
function [stat] = colorbarManualLocationRightOut()
|
|
stat.description = 'Manual positioning of colorbars - Right Out';
|
|
stat.issues = [933 937];
|
|
|
|
axLoc = 'out';
|
|
figPos = [1 , 1, 11 ,10];
|
|
axPos(1,:) = [1 , 1, 8 , 3];
|
|
axPos(2,:) = [1 , 5, 8 , 3];
|
|
cbPos = [9.5, 1, 0.5, 7];
|
|
|
|
colorbarManualLocationHelper_(figPos, axPos, cbPos, axLoc);
|
|
end
|
|
function [stat] = colorbarManualLocationRightIn()
|
|
stat.description = 'Manual positioning of colorbars - Right In';
|
|
stat.issues = [933 937];
|
|
|
|
axLoc = 'in';
|
|
figPos = [ 1 , 1, 11 ,10];
|
|
axPos(1,:) = [ 1 , 1, 8 , 3];
|
|
axPos(2,:) = [ 1 , 5, 8 , 3];
|
|
cbPos = [10.5, 1, 0.5, 7];
|
|
|
|
colorbarManualLocationHelper_(figPos, axPos, cbPos, axLoc);
|
|
end
|
|
function [stat] = colorbarManualLocationLeftOut()
|
|
stat.description = 'Manual positioning of colorbars - Left Out';
|
|
stat.issues = [933 937];
|
|
|
|
axLoc = 'out';
|
|
figPos = [1 , 1, 11 , 10];
|
|
axPos(1,:) = [2.5, 1, 8 , 3];
|
|
axPos(2,:) = [2.5, 5, 8 , 3];
|
|
cbPos = [1.5, 1, 0.5, 7];
|
|
|
|
colorbarManualLocationHelper_(figPos, axPos, cbPos, axLoc);
|
|
end
|
|
function [stat] = colorbarManualLocationLeftIn()
|
|
stat.description = 'Manual positioning of colorbars - Left In';
|
|
stat.issues = [933 937];
|
|
|
|
axLoc = 'in';
|
|
figPos = [1 , 1, 11 , 10];
|
|
axPos(1,:) = [2.5, 1, 8 , 3];
|
|
axPos(2,:) = [2.5, 5, 8 , 3];
|
|
cbPos = [0.5, 1, 0.5, 7];
|
|
|
|
colorbarManualLocationHelper_(figPos, axPos, cbPos, axLoc);
|
|
end
|
|
function colorbarManualLocationHelper_(figPos, axPos, cbPos, axLoc)
|
|
% this is a helper function, not a test case
|
|
set(gcf, 'Units','centimeters','Position', figPos);
|
|
|
|
hAx(1) = axes('Units', 'centimeters', 'Position', axPos(1,:));
|
|
imagesc([1,2,3], [4,5,6], magic(3)/9, [0,1]);
|
|
|
|
hAx(2) = axes('Units', 'centimeters', 'Position', axPos(2,:));
|
|
imagesc([1,2,3], [4,5,6], magic(3)/9, [0,1]);
|
|
|
|
hCb = colorbar('Units', 'centimeters', 'Position', cbPos);
|
|
try
|
|
% only in HG2
|
|
%TODO: check if there are HG1 / Octave counterparts for this property
|
|
set(hCb, 'AxisLocation', axLoc);
|
|
end
|
|
|
|
labelProperty = {'Label', 'YLabel'}; %YLabel as fallback for
|
|
idxLabel = find(cellfun(@(p) isprop(hCb, p), labelProperty), 1);
|
|
if ~isempty(idxLabel)
|
|
hLabel = get(hCb, labelProperty{idxLabel});
|
|
set(hLabel, 'String', ['AxisLocation = ' axLoc]);
|
|
end
|
|
end
|
|
% =========================================================================
|