- Undocumented Matlab - https://undocumentedmatlab.com -

Plot markers transparency and color gradient

Posted By Yair Altman On November 19, 2014 | 90 Comments

Last week I explained how to customize plot-lines with transparency and color gradient [1]. Today I wish to show how we can achieve similar effects with plot markers. Note that this discussion (like the preceding several posts) deal exclusively with HG2, Matlab’s new graphics system starting with R2014b (well yes, we can also turn HG2 on in earlier releases [2]).
As Paul has noted in a comment [3] last week, we cannot simply set a 4th (alpha transparency) element to the MarkerFaceColor and MarkerEdgeColor properties:

>> x=1:10; y=10*x; hLine=plot(x,y,'o-'); drawnow;
>> hLine.MarkerFaceColor = [0.5,0.5,0.5];      % This is ok
>> hLine.MarkerFaceColor = [0.5,0.5,0.5,0.3];  % Not ok
While setting the 'MarkerFaceColor' property of Line:
Color value must be a 3 element numeric vector

Standard Matlab plot markers
Standard Matlab plot markers

Lost cause? – not in a long shot. We simply need to be a bit more persuasive, using the hidden MarkerHandle property:

>> hMarkers = hLine.MarkerHandle;  % a matlab.graphics.primitive.world.Marker object
>> hMarkers.get
    EdgeColorBinding: 'object'
       EdgeColorData: [4x1 uint8]
       EdgeColorType: 'truecolor'
    FaceColorBinding: 'object'
       FaceColorData: [4x1 uint8]
       FaceColorType: 'truecolor'
    HandleVisibility: 'off'
             HitTest: 'off'
               Layer: 'middle'
           LineWidth: 0.5
              Parent: [1x1 Line]
       PickableParts: 'visible'
                Size: 6
               Style: 'circle'
          VertexData: [3x10 single]
       VertexIndices: []
             Visible: 'on'
>> hMarkers.EdgeColorData'  % 4-element uint8 array
ans =
    0  114  189  255
>> hMarkers.FaceColorData'  % 4-element uint8 array
ans =
  128  128  128  255

As we can see, we can separately attach transparency values to the marker’s edges and/or faces. For example:

hMarkers.FaceColorData = uint8(255*[1;0;0;0.3]);  % Alpha=0.3 => 70% transparent red

70% Transparent Matlab plot markers
70% Transparent Matlab plot markers

And as we have seen last week, we can also apply color gradient across the markers, by modifying the EdgeColorBinding/FaceColorBinding from ‘object’ to ‘interpolated’ (there are also ‘discrete’ and ‘none’), along with changing the corresponding FaceColorData/EdgeColorData from being a 4×1 array to a 4xN array:

>> colorData = uint8([210:5:255; 0:28:252; [0:10:50,40:-10:10]; 200:-10:110])
colorData =
  210  215  220  225  230  235  240  245  250  255
    0   28   56   84  112  140  168  196  224  252
    0   10   20   30   40   50   40   30   20   10
  200  190  180  170  160  150  140  130  120  110
>> set(hMarkers,'FaceColorBinding','interpolated', 'FaceColorData',colorData)

Matlab plot markers with color and transparency gradients
Matlab plot markers with color and transparency gradients

This can be useful for plotting comet trails, radar/sonar tracks, travel trajectories, etc. We can also use it to overlay meta-data information, such as buy/sell indications on a financial time-series plot. In fact, it opens up Matlab plots to a whole new spectrum of customizations that were more difficult (although not impossible [4]) to achieve earlier.
Throughout today, we’ve kept the default FaceColorType/EdgeColorType value of ‘truecolor’ (which is really the same as ‘truecoloralpha’ as far as I can tell, since both accept an alpha transparency value as the 4th color element). If you’re into experimentation, you might also try ‘colormapped’ and ‘texturemapped’.
p.s. – other chart types have similar internal objects that can be customized. For example, bar charts have internal Face and Edge properties that correspond to internal objects that can be similarly modified:

>> get(h.Edge)
          AlignVertexCenters: 'on'
             AmbientStrength: 0.3
                ColorBinding: 'object'
                   ColorData: [4×1 uint8]
                   ColorType: 'truecolor'
             DiffuseStrength: 0.6
            HandleVisibility: 'on'
                     HitTest: 'off'
                       Layer: 'middle'
                    LineJoin: 'miter'
                   LineStyle: 'solid'
                   LineWidth: 0.5
               NormalBinding: 'none'
                  NormalData: []
                      Parent: [1×1 Bar]
                         ...

Categories: Handle graphics, Medium risk of breaking in future versions, Stock Matlab function, Undocumented feature


90 Comments (Open | Close)

90 Comments To "Plot markers transparency and color gradient"

#1 Comment By Paul On November 20, 2014 @ 02:08

Thanks, this is useful — setting an alpha component is a better way to visualise density than [11].

#2 Comment By Grunde On November 24, 2014 @ 02:40

Is it possible to make the area plots transparent? Or do I have to use the patch command?

#3 Comment By Yair Altman On November 24, 2014 @ 03:02

@Grunde – Yes this is possible, but I don’t think you need to use any undocumented features for this. Assuming you used the builtin [12] function to generate the plot, you can set the FaceAlpha property of the area-plot’s children.

Alternatively, you can use the builtin [13] function.

#4 Comment By Grunde On November 24, 2014 @ 04:16

The area object doesn’t have any children. And the area object itself doesn’t have a FaceAlpha property. At least in 2014b.

#5 Comment By Yair Altman On November 24, 2014 @ 04:29

h = area(magic(4));  drawnow;  % 1x4 area object
set([h.Face], 'ColorType', 'truecoloralpha')
h(2).Face.ColorData(4) = 90;  % =90/255=35% opaque =65% transparent

#6 Comment By Guenter On December 2, 2014 @ 03:59

Dear Yair,

For some reason on Matlab 2014b the area alpha doesn’t seem to work. I copy/paste your sample and run it. Although it doesn’t throw any error, it seems to ignore the settings in h(2).Face.ColorData(4). I can change it to whatever value, but the transparency of the faces (areas) don’t change at all.
Am I missing something?

#7 Comment By Yair Altman On December 2, 2014 @ 04:42

It works for me… Perhaps you are using software emulation (not hardware acceleration) in your opengl. Type opengl(‘info’) to find out.

#8 Comment By Guenter On December 3, 2014 @ 02:21

Dear Yair,

Thanks for you reply. I did some further tests and I think I found at least one problem. When I run the area command within a loop for plotting multiple sets of data into one plot it sometimes happens that the x-axis is resized to fit the data. Whenever this command is called the previous settings are discarded and all areas have the same color and no transparency. Can you confirm that using e.g.

h = area(magic(4));  drawnow;  % 1x4 area object
set([h.Face], 'ColorType', 'truecoloralpha')
h(2).Face.ColorData(4) = 90;  % =90/255=35% opaque =65% transparent
xlim([1.5 2.5])

breaks the settings for transparency?

#9 Comment By Guenter On December 3, 2014 @ 04:59

Hi Again,

So, finally I figured it out how to circumvent the problem with the resizing. I simply had to apply the color and alpha settings at the very end of my plotting script (after settings xlims, adding legends, etc.). Then this works just fine.
Thanks again for your kind help and for putting this down for others to read!
Cheers

#10 Comment By Michael On November 25, 2014 @ 10:17

As far as I can tell, changing the EdgeColorBinding (or FaceColorBinding) from ‘object’ to ‘interpolated’ or ‘discrete’ is problematic. Entering Edit Plot mode (the pointer icon on the toolbar) resets the ColorBinding and ColorData back to ‘object’ and the original color.
Short Example:

x = 1:10; y= 1:10;
pl = plot(x,y,'*');
drawnow; % Otherwise pl.MarkerHandle gives me GraphicsPlaceholder objects
hmarkers = pl.MarkerHandle;
oldcolordata = hmarkers.EdgeColorData;
newcolordata = uint8(repmat(oldcolordata,1,numel(x)));
newcolordata(:,1) = [255;0;0;255]; % Turn the first marker red
hmarkers.EdgeColorData = newcolordata;
hmarkers.EdgeColorBinding = 'discrete';

This will generate a simple line with the first point red. Clicking the Edit Plot icon will reset all markers.

#11 Comment By Leonardo M. On March 31, 2015 @ 14:56

Even without changing EdgeColorBinding/FaceColorBinding from ‘object’ to ‘interpolated’ or ‘discrete’, the original color is reset back to the original color if a legend is added to the plot:

x=1:10; 
y=10*x; 
hLine=plot(x,y,'o-');
drawnow;
hLine.MarkerFaceColor = [0.5,0.5,0.5];
hMarkers = hLine.MarkerHandle;                    % a matlab.graphics.primitive.world.Marker object
hMarkers.FaceColorData = uint8(255*[1;0;0;0.3]);  % Alpha=0.3 => 70% transparent red
legend('show');                                   % ! This will reset back the original color.

Does anyone have a solution for this?

#12 Comment By Fabian On May 6, 2015 @ 15:45

Unfortunately, the same happens even when hitting ‘Edit’ -> ‘Copy Figure’ or trying to export it. I built a bunch of pretty figures with this but they are stuck within Matlab 🙁

#13 Comment By Yair Altman On May 6, 2015 @ 16:04

You can try to place your customization code in a short function that you’d reference in the axes CreateFcn property and/or its MarkedClean event (using addlistener).

#14 Comment By Fabian On May 8, 2015 @ 08:32

Yup, that works. Thanks so much, Yair. It’s a pretty awful hack job to achieve what I feel should be basic functionality but here we go:

% generate data
rng(144);
xData = normrnd(1, 0.2, 1000, 1);
yData = normrnd(1, 0.2, 1000, 1);

% plot and make transparent
ha = plot(xData, yData, 'ko');
drawnow();
hm = ha.MarkerHandle;
cFace = uint8(255*[0 0 1 0.1])';
cEdge = uint8(255*[0 0 0 0.3])';
hm.FaceColorData = cFace;
hm.EdgeColorData = cEdge;

% keep transparent
addlistener(ha,'MarkedClean',...
    @(ObjH, EventData) keepAlpha(ObjH, EventData, cFace, cEdge));

and the keep function:

function keepAlpha(src,eventData, FaceColor, EdgeColor)  
    hm = src.MarkerHandle;
    hm.EdgeColorData = EdgeColor;
    hm.FaceColorData = FaceColor;   
end

Note that when adding a legend the symbol comes up wrong. But at least I can export my scatter plots now…

#15 Comment By Claire O. On February 10, 2015 @ 15:52

Thanks for all the useful tips. I have a nitpicky question: when I change any hidden property of my figures I have to manually select the line of code and execute it by itself (sometimes I have to repeat this twice before it works). It will not just execute itself if I run it as a script or a function. Any idea why that is?

#16 Comment By Yair Altman On February 12, 2015 @ 11:56

@Claire – it should work in a script/function as well. You are probably doing something wrong. Perhaps the figure is not visible when it reaches that line of code, or maybe you just need to add a pause(0.1) and/or drawnow before your property-modification line.

#17 Comment By Claire O. On March 5, 2015 @ 13:15

@Yair, I just saw your response. Thanks so much, adding the drawnow did the trick!

#18 Comment By Fabian On May 5, 2015 @ 08:52

Hi.
Thanks for writing this post. I find transparent markers really essential for making dense scatter plots readable. However, when I run your code (see below), hMarkers is empty. I use 2014b on Win8. Any idea what’s going wrong?

x=1:10; y=10*x;
hLine=plot(x,y,'o-');
hMarkers = hLine.MarkerHandle;  % this is fine but returns a 0x0 empty GraphicsPlaceholder array
hMarkers.get % hence this does nothing
hMarkers.FaceColorData = uint8(255*[1;0;0;0.3]);  % this fails

#19 Comment By Yair Altman On May 5, 2015 @ 08:56

@Fabian – simply add a drawnow call after your plot(), before accessing hLine.MarkerHandle.

#20 Comment By Fabian On May 5, 2015 @ 09:06

splendid. Thank you 🙂

#21 Comment By luc On May 8, 2015 @ 05:37

Hello!

I’m trying this in matlab r2015a, I got the same problem as Fabian, but the drawnow command does not solve the problem.

 
x_new3=nan; y_new3=nan; z_new3=nan;
threednumeric3=scatter3(x_new3,y_new3,z_new3,'blue')
set(threednumeric3,'XDataSource','x_new3');
set(threednumeric3,'YDataSource','y_new3');
set(threednumeric3,'ZDataSource','z_new3');
drawnow
hMarkers = threednumeric3.MarkerHandle;  % a matlab.graphics.primitive.world.Marker object
hMarkers.get
hMarkers.FaceColorData = uint8(255*[1;0;0;0.3]); % Alpha=0.3 => 70% transparent red

#22 Comment By Philip On July 16, 2015 @ 08:01

Hey Yair,

thank you very much for these very valuable tips! They really open up a plethora of charting options that come in very handy, in my case.

Do you have any further details / documentation about ‘MarkerHandle’? For example, I am wondering about how to use the xxBinding properties; how exactly do ‘object’, ‘interpolated’, ‘discrete’ and ‘none’ work?

One more question: in MATLAB, I frequently need to generate a 2D scatter plot with:
(1) use individual marker transparencies to encode a 3rd variable (e.g. age of people). Your post solves this 🙂
(2) use individual marker sizes to encode a 4th variable (e.g. number of people). I’m stuck here: I do not know of any possibility to vary the marker sizes individually. While there are appropriate object properties (Size for the Line class, and MarkerSize for the MarkerHandle class), these are apparently required to be scalars.
I’d love to set these to a vector. For performance reasons, I would like to avoid calling ‘line’ several times in a loop.
Do you have any idea or suggestion?

Thank you very much!
Philip

#23 Comment By Philip On July 16, 2015 @ 08:09

an example of what I’m talking about can be found here:
[14]

#24 Comment By Yair Altman On July 16, 2015 @ 08:15

@Philip – If you use scatter or scatter3, then you can set the SizeData property to be either a scalar or a vector the same size as the data.

#25 Comment By Philip On July 16, 2015 @ 23:59

Absolutely terrific! I was not aware of SizeData
Thank you very much!! Hope this will help others as well.

#26 Comment By Priyanka On August 7, 2015 @ 05:27

Thanks for this useful tip! I’m still finding my way around MATLAB, and unfortunately I’m stuck – was wondering if I can access the hidden MarkerHandle in Matlab 2013a? Not able to find any documentation on this. Thanks for any help.

Cheers

#27 Comment By Yair Altman On August 7, 2015 @ 08:37

@Priyanka – this functionality is only available in Matlab’s new graphics system (HG2), which became officially available in Matlab release R2014b (i.e., 3 releases after yours). If you wish to access its undocumented and still unstable functionality in your R2013a, then follow the instructions here: [15]

#28 Comment By Dani On October 2, 2015 @ 03:17

The keepAlpha of Fabian does a good job preventing Matlab to get rid of the transparency again when, e.g., legend is called. Is there a way to convince ‘legend’ to show the transparent markers properly too?

#29 Comment By Christopher On October 29, 2015 @ 10:59

Hi Dani and Yair,
I have been using the keepAlpha trick with success as well to keep transparency on the figure Markers when toggling the legend. I am, as Dani, very keen to find a solution to keep the transparency in the legend markers as well.
Any hint into where to look for a begining of solution would be very welcome. For example, is there a hidden way to access the handles to the Markers that are in the legend ? Would the optimal solution be to create a function myLegend that would design the legend from scratch ?
BR

#30 Comment By Yair Altman On November 3, 2015 @ 01:59

@Dani & @Christopher:

The legend function clears marker customizations such as transparency. You can restore the transparency by re-updating hMarkers.FaceColorData following the legend call.

In order to customize the legend itself, we need to dig into the legend object’s hierarchy. This is not too difficult:

hLegend = legend('on');
hMarkers.FaceColorData = uint8(255*[1;0;0;0.3]);  % Alpha=0.3 => 70% transparent red  - restored after the legend call
hLegendComponents = hLegend.EntryContainer.Children;  % hLegendComponents has 2 children: child 1 = LegendIcon, child 2 = Text (label)
hLegendIconComponents = hLegendComponents.Icon.Transform.Children;  % child 1 = Marker, child 2 = LineStrip
hLegendMarker = hLegendIconComponents.Children(1);
hLegendMarker.FaceColorData = uint8(255*[1;0;0;0.3]);  % Alpha=0.3 => 70% transparent red

simple.

#31 Comment By EZ On November 3, 2015 @ 01:10

Hi Yair,
Thank you for the terrific post! I have a question on printing figure to pdf (or any format really!) and retaining the transparency. It used to be that zbuffer would do the trick (loses vector format) but at least the transparency property is not lost. In >2014, zbuffer is no longer an option. I was wondering if you have had any success in using other renderers? Thanks again.
EZ

#32 Comment By Yair Altman On November 3, 2015 @ 02:07

@EZ – transparency output is (and always was) problematic in Matlab. In general, painters does not render transparencies so in HG2 (R2014b onward) we need to use the slower opengl renderer for export. Try using print -dpdf and/or the export_fig utility. You’ll probably still run into limitations with either of these though.

#33 Comment By Carl Witthoft On January 28, 2016 @ 20:48

(sorry about directly emailing – I missed your warnings)
Hi – re your column on assigning transparency to plot markers: I tried the code on a simple example and all was well. Then I tried a tight loop, plotting a single point at a time (doing this to assign a different color to each point in the graph), and invariably within a few loop cycles, when I grab the “plothandle.MarkerHandle”, it’s empty. In these cases, the class of this empty object is “Matlab.graphics.GraphicsPlaceholder”
while when the operation is successful, the class is:
“matlab.graphics.primitive.world.Marker”

I’ve tried things like clearing variables every loop, putting in a delay timer, and so on, with no luck. Any idea what’s going on?
many thanks
Carl

#34 Comment By Yair Altman On January 29, 2016 @ 13:50

Cross-referenced solution (as for [16], to add a call to drawnow): [17]

#35 Comment By Carl Witthoft On January 29, 2016 @ 16:58

Yep, at least for me drawnow solved the problem. I was the OP for that SO question, btw 🙂

#36 Comment By Yair Altman On January 30, 2016 @ 18:06

Yes of course. But since you neglected to come back here and update that you have found a solution, causing me and other readers extra effort to look for a solution, I thought it would at least be nice of me to inform other readers here that a solution was found. Next time please be more considerate of others.

#37 Comment By ACenTe On March 29, 2016 @ 01:42

Great article, it was very helpful.

I found an issue, though I don’t think it’s related to this method “per se”. When I try to export the figure, the transparency of the markers is lost, but the transparency of other objects is kept (for example, patches).

Is there a solution for this? or any way to export the figure exactly as it’s shown in the Figure window?

I’m using 2014b and I’ve tried exporting to png and pdf using both the painter and the OpenGL renderers with similar results.

#38 Comment By Nasser On April 17, 2016 @ 03:14

The above does not work on Matlab 2016a. I get no transparency at all.
>> ver
—————————————————————————————————-
MATLAB Version: 9.0.0.341360 (R2016a)
MATLAB License Number: STUDENT
Operating System: Microsoft Windows 7 Home Premium Version 6.1 (Build 7601: Service Pack 1)
Java Version: Java 1.7.0_60-b19 with Oracle Corporation Java HotSpot(TM) 64-Bit Server VM mixed mode

x=1:10; y=10*x; hLine=plot(x,y,'o-'); drawnow;
hLine.MarkerFaceColor = [0.5,0.5,0.5];
hMarkers.FaceColorData = uint8(255*[1;0;0;0.3]);

The dots are still the same color. No transparency. Nothing changed.

#39 Comment By Yair Altman On April 18, 2016 @ 12:38

@Nasser – this is because you did not read carefully, and so you missed 3 important commands!

x=1:10; y=10*x; hLine=plot(x,y,'o-'); drawnow;
hLine.MarkerFaceColor = [0.5,0.5,0.5];
drawnow
hMarkers = hLine.MarkerHandle;
hMarkers.FaceColorType = 'truecoloralpha';
hMarkers.FaceColorData = uint8(255*[1;0;0;0.3]);

#40 Comment By Lukas K. On April 28, 2016 @ 12:53

Hi! I’m would like to get a better view of many points in a scatter3 plot, but unfortunately the transparency is lost once I rotate the plot. Is there a way to fix that?

#41 Comment By Yair Altman On May 5, 2016 @ 13:49

@Lukas – Matlab automatically removes transparency when you modify the axes (e.g., by rotation). You could attach a callback listener to the [18] that will restore the transparency once Matlab finishes doing its internal updates.

#42 Comment By Paweł On July 6, 2016 @ 19:44

Hello,
Is it possible to do with point cloud plot command: pcshow();? I want to change size of Brushing marker.
I get this:

>> drawnow
>> hMarkers = hLine.MarkerHandle;
No appropriate method, property, or field 'MarkerHandle' for class 'matlab.graphics.axis.Axes'.

I’ve been looking into hidden lines, axes properties, but I can’t find it anywhere.

#43 Comment By Yair Altman On July 6, 2016 @ 20:45

@Pawel – you have a bug in your code. As the error message indicates, hLine in your code is a handle to the axes, not to the line.

#44 Comment By Marconi Barbosa On August 29, 2016 @ 06:42

Sweet. But when I try to print, Matlab2014b clears everything. I created events listeners for markers in both plot and legends. That works fine to rebuild after a click in ‘show plot tools’; but won’t work in print preview… 😐

#45 Comment By Yair Altman On August 29, 2016 @ 10:32

@Marconi – this has already been reported by others on this blog. Matlab’s print and saveas functions clear such transparencies, and there is no known workaround for this. You can use a screen capture utility to capture the actual appearance and then print from that screen-capture.

#46 Comment By Anon On October 3, 2016 @ 21:54

Use MATLAB2015b! It will print transparencies correctly.

#47 Comment By Anon On October 3, 2016 @ 21:52

I found that when I upgraded to Matlab 2016a, the transparency functions will generate figures in the correct way but will not print the transparencies. Importantly, 2015b prints figures properly!

#48 Comment By LucyK On October 12, 2016 @ 17:15

Thank you so much for this page, it is fantastic! I finally have my transparent scatter plots back in 2015a!

#49 Comment By LucyK On October 12, 2016 @ 17:29

PS I found a workaround to save transparency changes in matlab 2015a: if you use saveas to save the file as *.svg, then open in Inkscape (free) and export as a png there, transparency values are saved.

I also found I needed to build in a brief pause in my script before obtaining the marker handle to avoid getting the following error: “Too many outputs requested. Most likely cause is missing [] around left hand side that has a comma separated list expansion.“. Reading back, it looks like another user has also mentioned this – pause(1) (shorter is possibly fine too) resolved the error.

#50 Comment By Collin On November 15, 2016 @ 04:33

Hi, I was just attempting to control plot marker transparency as described in this tutorial but for a line object made using
plot3. It seems like there is no MarkerHandle object created when using plot3. Is that the case? No way to make transparent marker faces / edges on a 3D plot?

Thanks for making such a great resource.

#51 Comment By Yair Altman On November 15, 2016 @ 11:12

@Collin – there is indeed a MarkerHandle property also for plot3, exactly the same as for plot. The property is simply hidden and not displayed when you run the get/set commands, but once you know that it exists you can use it just like any other property.

#52 Comment By Collin On November 15, 2016 @ 21:09

@Yair – Ah, I’ve figured out my problem. Or at least I’ve figured out how to avoid it. It seems that if you set LineStyle, Marker, MarkerSize, or any items of that nature using the line handle before using hLine.MarkerHandle, then MarkerHandle becomes inaccessible.

I’ve also noticed that none of the changes made using MarkerHandle are reflected by the line properties.

#53 Comment By John Kegelman On November 18, 2016 @ 09:40

Hi all. Great post. I tried this with R2016b and ran into similar issues when trying to export, i.e. the transparency would be lost. I found that MATLAB’s scatter command does pretty much exactly what I wanted by setting the (mildly undocumented?) MarkerEdgeAlpha and MarkerFaceAlpha properties, as mentioned [19]. Then export_fig works its magic and everything looks great (even in pdf!). My code looked something like this:

scatter(X, Y, 6, 'filled', ...
    'MarkerEdgeColor', [0 114 189]/255, ...
    'MarkerEdgeAlpha', 0.3            , ...
    'MarkerFaceColor', [0 114 189]/255, ...
    'MarkerFaceAlpha', 0.1);

Hope that helps!

#54 Comment By John Smith On November 22, 2016 @ 02:54

“Throughout today, we’ve kept the default FaceColorType/EdgeColorType value of ‘truecolor’ (which is really the same as ‘truecoloralpha’ as far as I can tell, since both accept an alpha transparency value as the 4th color element).”

As far as I tested, the above is not true for R2016b. It seems that you need to set FaceColorType/EdgeColorType to ‘truecoloralpha’ in order to get transparency effect.

#55 Comment By Da V On February 2, 2017 @ 19:23

Hi Yair,
Thanks for this awesome post. I am currently using R2014b however I cannot even find the property of the marker’s handle.

>> hLine = plot(t,x,'o','LineWidth',2); drawnow;
>> hMarkers = hLine.MarkerHandle;
>> hMarkers.EdgeColorData = [1,1,1,0.2];
Invalid or deleted object.

My opengl setting is as follows:

opengl('info')
                          Version: '1.1.0'
                           Vendor: 'Microsoft Corporation'
                         Renderer: 'GDI Generic'
                   MaxTextureSize: 1024
                           Visual: 'Visual 0x0e, (RGB 24 bits (8 8 8), Z ...'
                         Software: 'true'
        SupportsGraphicsSmoothing: 0
    SupportsDepthPeelTransparency: 0
       SupportsAlignVertexCenters: 0
                       Extensions: {3x1 cell}
               MaxFrameBufferSize: 0

I find it very annoying that even copying some tutorial lines into my matlab doesn’t help set the target transparent.
Do you have any suggestion for this situation? Many thanks in advance.

Best regards,
Da

#56 Comment By Yair Altman On February 2, 2017 @ 19:40

@DaV – I suspect that you have some extra code between the line where you plot() the data and the line where you extract/update the hMarkers and in the meantime either the line or the markers were deleted.

In any case, your code was buggy in the sense that EdgeColorData expects a uint8 column array of values (as explained in my posts).

The following code snippet should work as-is:

hLine = plot(1:5,2:6,'o','LineWidth',2); drawnow;
hMarkers = hLine.MarkerHandle; 
hMarkers.EdgeColorData = uint8(255*[1,0.4,0.6,0.2]');

There is also a possibility that this does not work on R2014b, which was the first Matlab release to officially use the new graphics system (HG2). In this case, try it with a newer release if you can.

There is also the possibility that this is due to your use of OpenGL emulation mode (software=’true’). You should really try to update your graphics driver so that Matlab will use OpenGL hardware acceleration (software=’false’), because the new graphics engine relies on OpenGL hardware much more than the previous graphics system (HG1, used until R2014a).

#57 Comment By Da V On February 3, 2017 @ 11:31

@Yair,

Thanks a lot for the trouble shooting. I pasted your code into the command line, it works perfectly.
I wondered a bit as there were actually nothing different between the code and what I tried yesterday but the last line.
Lastly I found this would be the key:

>> hLine = plot(1:5,2:6,'o','LineWidth',2); drawnow;
>> hMarkers = hLine.MarkerHandle; 
>> hMarkers.EdgeColorData = uint8(255*[1,0.4,0.6,0.2]');    %works fine

>> hMarkers.EdgeColorData                                   %This cannot show the current value of the markers.
Invalid or deleted object. 

>> hMarkers.EdgeColorData.get                               %This can neither.
Invalid or deleted object.

I will try a 2016 release on another computer tomorrow. Many thanks for this post. An eye-opener 🙂

Da

#58 Comment By KOUICHI C. NAKAMURA On August 24, 2017 @ 17:46

I really liked this hidden feature, but as far as I can see, R2017a and R2017b (prerelease) do not support the alpha setting of Markers as in:

hMarkers.FaceColorData = uint8(255*[1;0;0;0.3]); 

The markers turn red by this, but they are not transparent.

#59 Comment By Yair Altman On August 25, 2017 @ 14:42

@Kouichi – I believe that you are mistaken: Depending on exactly which type of Markers you have, it is possible that you simply need to modify the EdgeColorData instead of FaceColorData, and/or to modify EdgeColorType/FaceColorType from their default value of ‘truecolor’ to ‘truecoloralpha’. You will then see the transparent markers nicely.

#60 Comment By FP On October 4, 2017 @ 10:34

Is there also a hidden MarkerHandle or something similar for animatedline? Because I get the following error trying the same with animatedline:

No appropriate method, property, or field 'MarkerHandle' for class 'matlab.graphics.animation.AnimatedLine'.

#61 Comment By Peter Rochford On November 29, 2017 @ 06:06

I have written a collection of Matlab functions for creating semi-transparent markers in plots and legends. The files are available from MATLAB Central as the [20] package. A few examples of how to use these functions are included in the download and there is also a Wiki on [21]. A major benefit of this package is that it enables the user to have the semi-transparent markers also appear in the legend.

#62 Comment By Yair Altman On November 29, 2017 @ 09:49

@Peter – very nice, thanks for sharing.

It would be nice if you would cite a reference to [22] in the File Exchange description text, and in your GitHub [23].

#63 Comment By Hassan On November 29, 2017 @ 19:44

Hi all;
I am facing problems exporting such figures as a pdf/svg to modify it using illustrator, especially when I have multiple subplots!
could anyone help me with this?
Best,

#64 Comment By Yair Altman On November 29, 2017 @ 19:47

Try to use the [24] utility

#65 Comment By Hassan On November 29, 2017 @ 19:56

the problem is once exporting either using saveas or print functions, the transparency is not saved and gives a full normal color image! Thanks.

#66 Comment By Hassan On November 29, 2017 @ 20:12

Thanks Yair,
Still, have the same problem. export_fig is exporting the figure without applying the transparency to the markers. On the screen, I have a nice figure, but once exporting the figure I am loosing all. I played with the rendering options, didn’t see any change or improvement! any idea?

#67 Comment By Yair Altman On November 29, 2017 @ 21:09

So try using the [25] utility. Note that it only generates bitmap sceenshots, not vectorized (PDF/EPS) ones.

#68 Comment By Tyler Goodell On March 1, 2018 @ 00:46

This is awesome Yair.

However, now I’m wondering if it’s possible to change the marker of a specific subset of plotted points after they’ve already been plotted. For example, if I set x = [1:10] and y = [1:10], and I plot(x,y,’o’), is it possible to change the circles to triangles from x(2:4)?

#69 Comment By Yair Altman On March 2, 2018 @ 11:15

@Tyler – you cannot do that on the plotted markers directly, but you could create the line with no markers, and then overlay it with 2 additional lines that have no line, just the markers. For example:

line(1:10,    1:10,    'LineStyle','-');  % original line with no markers
line([1,5:9], [1,5:9], 'LineStyle','none', 'marker','o', 'MarkerFaceColor','r');  % red circle markers
line(2:4,     2:4,     'LineStyle','none', 'marker','^', 'MarkerFaceColor','g');  % green triangle markers

#70 Comment By Hassan On June 23, 2018 @ 06:37

Hi, I used the suggested script on pc and worked fine. However, when I moved to mac the same script stop working, and I have not transparency gradient. Any help? Thanks,

#71 Comment By Yair Altman On June 26, 2018 @ 09:58

@Hassan – check perhaps a different figure renderer is used on your two computers.

#72 Comment By gianfry On December 9, 2018 @ 14:29

Hello, I successfully applied the transparency and color gradient to the markers. However, this works for me just with the filled (heavier) markers like ‘o’, not for the lighter markers like ‘.’ and ‘+’. Any idea on that?

#73 Comment By Yair Altman On December 9, 2018 @ 15:45

My hunch is that the simpler markers are implemented as OpenGL primitives and these are not painted like the more complex markers and are therefore not as customizable.

#74 Comment By Antonius Armanious On March 13, 2019 @ 10:29

Thanks a lot for the very useful hack. Do you know how one can do something similar to a bar chart? In other words what would be the equivalent for MarkerHandler in a bar chart?
Thanks a lot

#75 Comment By Yair Altman On March 13, 2019 @ 10:47

@Antonius – the corresponding internal objects in a bar chart are hBarChart.Edge and hBarChart.Face.

Also see related:
* [26]
* [27]

#76 Comment By Antonius Armanious On March 13, 2019 @ 12:08

I tried using hBarChart.Face to change the colors of the bars, but it did not work. I do not get any errors, but colors do not change. Here you are the command lines I used

fbarHandle = bar( ax_fBar                                 , ...
                  Overtoone(2:6) , freqBar_AVG( 2:6 , 1 ) , ...
                  'BarWidth'     , 0.8                    , ...
                  'LineWidth'    , 0.25                   );

barColor = repelem([0.5, 0.5, 0.5], 5, 1);  % all 5 bars will have the same color
for n = 1:5
    barColor(n,4) = (6-n)*0.15;  % each bar will have a different alpha
end
barColor = barColor';
barColor = barColor * 255;
barColor = uint8(barColor);

FaceHandle = get(fbarHandle.Face);
FaceHandle.ColorBinding = 'interpolated';
FaceHandle.ColorType    = 'truecoloralpha';
FaceHandle.ColorData    = barColor;   

#77 Comment By Yair Altman On March 17, 2019 @ 22:27

@Antonius – try to add drawnow; pause(0.1); after the creation of the bar, before the use of the Face property.

#78 Comment By Wolfgang On April 9, 2019 @ 00:57

any hint on how this works with r2018b and beyond?
I was just trying this on a plot and get:

h = plot(1:1:5, 'bo');
h.FaceColorData
No appropriate method, property, or field 'FaceColorData' for
class 'matlab.graphics.chart.primitive.Line'.

so I guess this ‘hack’ doesn’t work anymore. Is there a new way?

#79 Comment By Yair Altman On April 9, 2019 @ 02:09

Of course it still works. Did I ever say “h.FaceColorData” (where h is the plot return handle) anywhere in my post? Read the post text carefully and try the code snippets one by one.

#80 Comment By Wolfgang On May 8, 2019 @ 23:40

ok, shame on me Yair, obviously it wasn’t the plot handle, might have been too late. I had another look and of course you’re right, it works.

Peter Rochford’s function which was an implementation of this didn’t work starting with r2018b anymore as he writes at the file exchange
[28]

The comment of Arnold there is weird though. Adding a pause in front of setting the alpha value makes it reliable again. I wrote a test for it and yes, reliably works with a pause. Very strange.

#81 Comment By Yair Altman On June 16, 2019 @ 18:09

The extra pause() (or drawnow) call forces Matlab’s graphic engine to flush (execute) any pending graphic rendering events in its graphics queue, thereby ensuring that when you set the transparency it “sticks”. Without the pause/drawnow, the graphics queue might reset the transparency after you have set it, depending on internal timings over which we have no control.

Related: [29]

#82 Comment By Hassan On July 14, 2019 @ 15:19

Dear Yair,
I have the following code that worked for me in the past. I have nothing new except or using different dataset (the Matlab version is the same 2016a). But it is not working now!
I am getting a warning message after running the following command

hMarkers.FaceColorData=CMdata;
Warning: Error creating or updating Marker
 Error in value of property  ColorData
 Array contains incorrect data values

Here are the full code lines that I used:

CMtrans=uint8(255*(sum(hint.mat_norm(markersIn,:),1)./max(sum(hint.mat_norm(markersIn,:),1))));
CMdata=uint8([repmat(mCol'*255,1,length(CMtrans)); CMtrans]);
L2=scatter(ax,hint.xy(cellsIn,1),hint.xy(cellsIn,2),floor(ms2*frac),mCol,'filled');
drawnow;
hMarkers = L2.MarkerHandle;
hMarkers.FaceColorType = 'truecoloralpha';
hMarkers.FaceColorData=CMdata;
set(hMarkers,'FaceColorBinding','interpolated', 'FaceColorData',CMdata);

Any advice?
Thanks, HM

#83 Comment By Hassan On July 14, 2019 @ 18:44

solved. the scatter plot was prepared for part of the full cell number!

#84 Comment By Tim On December 21, 2019 @ 00:56

Thank you for this post, it is very useful. It seems that when using plot3, if I have more than 25,000 points and I change my figure size or rotate the image, the MarkerHandle values revert back to the original settings and all color-information and/or transparency information is immediately reset. It is simple enough to reset the MarkerHandle properties following a viewpoint transformation but it is a bit of a pain, especially since I would like to explore the 3D point cloud using zoom and rotation. Have you discovered a similar issue and is there a workaround to this problem? The Matlab version I’m using is R2019a

#85 Comment By Pierre On August 26, 2020 @ 12:15

Hello,
This post has been really useful to me. I just want to share a small trick. I have no idea whether it is reproducible or how it works, but it does the job for me (Win 10, R2019b).
When I use plot function, the transparency settings are always reset by any command related to the current figure.
However, when I use errorbar the transparency settings are kept. So, I have been using errorbar instead of plot, with a ‘fake’ error vector, and a capsize equal to 0.
E.g.:

fake_y_error = zeros(length(data_y),1);
he = errorbar(x_data, y_data, fake_y_error)
drawnow
he_mh = he.MarkerHandle;
he_mh.FaceColorType = 'truecoloralpha';
he_mh.FaceColorData = uint8(255*[1;0;0;0.3]); 
he.CapSize = 0;

And, all the more convenient, it works when actual error-bars are needed.

#86 Comment By Yair Altman On August 26, 2020 @ 12:27

@Pierre – thanks for sharing this clever useful trick

#87 Comment By Oliver On March 7, 2022 @ 20:33

This seems to have been disabled in the most recent version of Matlab (R2021b). When I use this method the hMarker.FaceColorData does change, but the markers are not made transparent. Any ideas?

#88 Comment By Yair Altman On March 7, 2022 @ 20:47

Oliver – you probably forgot to update hMarkers.FaceColorType to ‘truecoloralpha‘:

x=1:10; y=10*x;
figure; hLine = plot(x,y,'o-');
hLine.MarkerFaceColor = 'r'; drawnow
hLine.MarkerHandle.FaceColorType = 'truecoloralpha';  % default='truecolor' without alpha
hLine.MarkerHandle.FaceColorData = uint8(255*[1;0;0;.3]);
drawnow

#89 Comment By Dom On May 30, 2022 @ 19:49

Yair I have tried your code with trucoloralpha and the markers do not appear transparent in R2021b, same as for Oliver.

#90 Comment By Yair Altman On May 31, 2022 @ 18:30

Dom – call drawnow *just before* you set hLine.MarkerHandle.FaceColorType to 'truecoloralpha'.
Also, you made a typo in your code: it’s truecoloralpha, not trucoloralpha.


Article printed from Undocumented Matlab: https://undocumentedmatlab.com

URL to article: https://undocumentedmatlab.com/articles/plot-markers-transparency-and-color-gradient

URLs in this post:

[1] plot-lines with transparency and color gradient: http://undocumentedmatlab.com/blog/plot-line-transparency-and-color-gradient

[2] turn HG2 on in earlier releases: http://undocumentedmatlab.com/blog/hg2-update#testing

[3] comment: http://undocumentedmatlab.com/blog/plot-line-transparency-and-color-gradient#comment-337557

[4] not impossible: http://undocumentedmatlab.com/blog/plot-line-transparency-and-color-gradient#comment-337753

[5] Plot line transparency and color gradient : https://undocumentedmatlab.com/articles/plot-line-transparency-and-color-gradient

[6] Undocumented plot marker types : https://undocumentedmatlab.com/articles/undocumented-plot-marker-types

[7] Plot legend customization : https://undocumentedmatlab.com/articles/plot-legend-customization

[8] Accessing plot brushed data : https://undocumentedmatlab.com/articles/accessing-plot-brushed-data

[9] Draggable plot data-tips : https://undocumentedmatlab.com/articles/draggable-plot-data-tips

[10] Accessing hidden HG2 plot functionality : https://undocumentedmatlab.com/articles/hidden-hg2-plot-functionality

[11] : https://undocumentedmatlab.com/blog/undocumented-scatter-plot-jitter

[12] : http://www.mathworks.com/help/matlab/ref/area.html

[13] : http://www.mathworks.com/help/matlab/ref/alpha.html

[14] : http://glowingpython.blogspot.co.at/2011/11/how-to-make-bubble-charts-with.html

[15] : https://undocumentedmatlab.com/blog/hg2-update#testing

[16] : https://undocumentedmatlab.com/blog/plot-markers-transparency-and-color-gradient#comment-348846

[17] : http://stackoverflow.com/a/35070679/233829

[18] : https://undocumentedmatlab.com/blog/undocumented-hg2-graphics-events

[19] : https://www.mathworks.com/matlabcentral/answers/181548-how-can-i-set-transparency-in-2d-plot#comment_338689

[20] : http://www.mathworks.com/matlabcentral/fileexchange/65194-peterrochford-markertransparency

[21] : http://github.com/PeterRochford/MarkerTransparency/wiki

[22] : https://undocumentedmatlab.com/blog/plot-markers-transparency-and-color-gradient

[23] : https://github.com/PeterRochford/MarkerTransparency/blob/master/README.md

[24] : https://github.com/altmany/export_fig

[25] : https://undocumentedmatlab.com/blog/screencapture-utility

[26] : https://undocumentedmatlab.com/blog/bar-plot-customizations

[27] : https://undocumentedmatlab.com/blog/customizing-histogram-plots

[28] : https://www.mathworks.com/matlabcentral/fileexchange/65194-peterrochford-markertransparency

[29] : https://undocumentedmatlab.com/blog/solving-a-matlab-hang-problem

Copyright © Yair Altman - Undocumented Matlab. All rights reserved.