## Loren on the Art of MATLABTurn ideas into MATLAB

Note

Loren on the Art of MATLAB has been archived and will not be updated.

# Plotting with Style

One of MATLAB's features is being able to customize plots. But some of the customization may not need to be done by hand and can instead be controlled programmatically. Let me show you a set of these having to do with plotting lines.

### Contents

If you make a plot by successively adding lines, all the lines, by default, have the same color and linestyle.

m3 = magic(3);
plot(m3(:,1));
hold on
plot(m3(:,2))
plot(m3(:,3))
hold off

As you can see, it's very hard (impossible) to tell which line is which.

### Manually Control Color and Style

I can distinguish the lines by using different colors and linestyles. Here's one way to do it.

plot(m3(:,1),'r');
hold on
plot(m3(:,2),':b')
plot(m3(:,3),'g--')
hold off

### Vectorizing Line Drawing

I can instead vectorize the line drawing.

plot(m3)

What you see here is the MATLAB cycles through colors to distinguish the plots. How many colors and which ones? Does MATLAB ever cycle through the linestyles? You can find out answers to these questions in the documentation on LineStyle and Color as well as some answers in this article.

### Default Line Properties

Let's see what properties lines in MATLAB have. First I'll create a line and then get the properties.

h = plot(m3(:,1));
get(h)
           DisplayName: ''
Annotation: [1x1 hg.Annotation]
Color: [0 0 1]
EraseMode: 'normal'
LineStyle: '-'
LineWidth: 0.5000
Marker: 'none'
MarkerSize: 6
MarkerEdgeColor: 'auto'
MarkerFaceColor: 'none'
XData: [1 2 3]
YData: [8 3 4]
ZData: [1x0 double]
BeingDeleted: 'off'
ButtonDownFcn: []
Children: [0x1 double]
Clipping: 'on'
CreateFcn: []
DeleteFcn: []
BusyAction: 'queue'
HandleVisibility: 'on'
HitTest: 'on'
Interruptible: 'on'
Selected: 'off'
SelectionHighlight: 'on'
Tag: ''
Type: 'line'
UserData: []
Visible: 'on'
Parent: 161.0015
XDataMode: 'auto'
XDataSource: ''
YDataSource: ''
ZDataSource: ''


To see what the default properties are, I can use set instead of get.

set(h)
ans =
DisplayName: {}
Color: {}
EraseMode: {4x1 cell}
LineStyle: {5x1 cell}
LineWidth: {}
Marker: {14x1 cell}
MarkerSize: {}
MarkerEdgeColor: {2x1 cell}
MarkerFaceColor: {2x1 cell}
XData: {}
YData: {}
ZData: {}
ButtonDownFcn: {}
Children: {}
Clipping: {2x1 cell}
CreateFcn: {}
DeleteFcn: {}
BusyAction: {2x1 cell}
HandleVisibility: {3x1 cell}
HitTest: {2x1 cell}
Interruptible: {2x1 cell}
Selected: {2x1 cell}
SelectionHighlight: {2x1 cell}
Tag: {}
UserData: {}
Visible: {2x1 cell}
Parent: {}
XDataMode: {2x1 cell}
XDataSource: {}
YDataSource: {}
ZDataSource: {}


Notice two particular properties, Color and LineStyle. get shows me the current values.

get(h,'Color')
ans =
0     0     1


set allows me to see the choices for that property.

set(h,'LineStyle')
[ {-} | -- | : | -. | none ]


### How Do axes Fit in?

Each line has a color and a linestyle, and they each have defaults, so what determines the behavior when I plotted multiple lines and got different colors? That's related to a property of axes which we can see here.

get(gca)
	ActivePositionProperty = outerposition
ALim = [0 1]
ALimMode = auto
AmbientLightColor = [1 1 1]
Box = on
CameraPosition = [2 5.5 17.3205]
CameraPositionMode = auto
CameraTarget = [2 5.5 0]
CameraTargetMode = auto
CameraUpVector = [0 1 0]
CameraUpVectorMode = auto
CameraViewAngle = [6.60861]
CameraViewAngleMode = auto
CLim = [0 1]
CLimMode = auto
Color = [1 1 1]
CurrentPoint = [ (2 by 3) double array]
ColorOrder = [ (7 by 3) double array]
DataAspectRatio = [1 2.5 1]
DataAspectRatioMode = auto
DrawMode = normal
FontAngle = normal
FontName = Helvetica
FontSize = [10]
FontUnits = points
FontWeight = normal
GridLineStyle = :
Layer = bottom
LineStyleOrder = -
LineWidth = [0.5]
MinorGridLineStyle = :
NextPlot = replace
OuterPosition = [0 0 1 1]
PlotBoxAspectRatio = [1 1 1]
PlotBoxAspectRatioMode = auto
Projection = orthographic
Position = [0.13 0.11 0.775 0.815]
TickLength = [0.01 0.025]
TickDir = in
TickDirMode = auto
TightInset = [0.0392857 0.0404762 0.00892857 0.0190476]
Title = [166.002]
Units = normalized
View = [0 90]
XColor = [0 0 0]
XDir = normal
XGrid = off
XLabel = [163.002]
XAxisLocation = bottom
XLim = [1 3]
XLimMode = auto
XMinorGrid = off
XMinorTick = off
XScale = linear
XTick = [ (1 by 11) double array]
XTickLabel = [ (11 by 3) char array]
XTickLabelMode = auto
XTickMode = auto
YColor = [0 0 0]
YDir = normal
YGrid = off
YLabel = [164.002]
YAxisLocation = left
YLim = [3 8]
YLimMode = auto
YMinorGrid = off
YMinorTick = off
YScale = linear
YTick = [ (1 by 11) double array]
YTickLabel = [ (11 by 3) char array]
YTickLabelMode = auto
YTickMode = auto
ZColor = [0 0 0]
ZDir = normal
ZGrid = off
ZLabel = [165.002]
ZLim = [-1 1]
ZLimMode = auto
ZMinorGrid = off
ZMinorTick = off
ZScale = linear
ZTick = [-1 0 1]
ZTickLabel =
ZTickLabelMode = auto
ZTickMode = auto

BeingDeleted = off
ButtonDownFcn =
Children = [162.004]
Clipping = on
CreateFcn =
DeleteFcn =
BusyAction = queue
HandleVisibility = on
HitTest = on
Interruptible = on
Parent = [1]
Selected = off
SelectionHighlight = on
Tag =
Type = axes
UserData = []
Visible = on



Well, hmmmm -- so many properties. Let me point out the two that are the ones to focus on for now.

get(gca,'ColorOrder')
ans =
0         0    1.0000
0    0.5000         0
1.0000         0         0
0    0.7500    0.7500
0.7500         0    0.7500
0.7500    0.7500         0
0.2500    0.2500    0.2500

get(gca,'LineStyleOrder')
ans =
-


Note: using gca is really only for debugging or illustration. Normally a handle should be gotten from the chosen axes and that handle specifically should be used.

### axes Properties ColorOrder and LineStyleOrder

There are two axes properties that you can set to help you make the lines in your plots follow a pattern of color and linestyle. To see how these work, let's set the defaults for these properties at the root of the handle graphics hierarchy and experiment.

set(0,'DefaultAxesLineStyleOrder',{'--',':'})
set(0,'DefaultAxesColorOrder',[1 0 1; 0 1 1; 0 1 0])
yvals = [1:10;1:10]
plot(yvals)
axis([1 2 0 size(yvals,2)+1 ])
yvals =
1     2     3     4     5     6     7     8     9    10
1     2     3     4     5     6     7     8     9    10


Now you see that MATLAB first cycles over the colors using the first linestyle, then again cycles over the colors with the second linestyle, etc., eventually cycling over the linestyles again as well.

### Do You Override the Defaults?

Do you override the line plotting defaults? Do you do this manually or by setting the defaults as I have shown here? Let me know here how you avoid hand-updating your plots.

Published with MATLAB® 7.5