Use MATLAB to create beautiful, custom violin plots

One of the most desired plot types, a favorite of R users, is the violin or half-violin. In this post I show how to accomplish this in MATLAB using two built-in functions: ksdensity and patch.

After reading this post, you will be able to understand the magic behind these graphs and make one yourself!

You have some great data for a boxplot, but you also want to view the distributions. Your supervisor suggests something called a violin, but you’re a MATLAB native and the last time you saw a violin was in your high school orchestra section. So you go looking:

There are some homemade solutions on the MathWorks page, but in general they don’t have the same aesthetic as what you’d see from an R package.

Here I will guide you through making a very basic half-violin, and a more complex example follows

Step 1: Create some fake data. We’ll create data that is a combination of two Gaussian distributions, with means at 0 and 10, and standard deviations of 5 and 1.

rng(5)mu = [0,10];
sigma = [5,0;0,1];
gm = gmdistribution( mu,sigma );
data = random(gm,30);
data = data(:);

Step 2: Create a kernel density function from your data, which is at the heart of those lovely half-violins.

xvalues = linspace( prctile(data,1), prctile(data,99), 100 );[f,xi] = ksdensity( data(:),xvalues,'Bandwidth',1,'BoundaryCorrection','reflection');

Step 3: Use patch for displaying it, and viola (or should we say, violin!)

figure; patch( 0-[f,zeros(1,numel(xi),1),0],[xi,fliplr(xi),xi(1)],'r' )

Tip: If your graph looks like it’s filling up the whole plot box, try adjusting the value of ‘Bandwidth’ in the ksdensity command.

By resizing the window, you can actually configure how the plot looks (which is one of the biggest advantages of plotting with MATLAB over R or Jupyter, in my opinion).

Now you understand the basics of plotting the violin using ksdensity and patch. In the gist below, I lay out how to generate the graph in the top panel. If you want to fully understand all the code I recommend you check out my other posts about how to grab objects in a figure, as well as arrayfun and patch.



Neuroscientist/cell biologist/data scientist at Columbia University

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Jozsef Meszaros

Neuroscientist/cell biologist/data scientist at Columbia University