Recently matplotlib has added a native support for violin plot. What I want to do is half-violin plot as here. I guess that it can be done changing the body
the function is returning. Do you know how to plot half violin plot as in the example but using the new function from matplotlib?
Violin PlotA “wide-form” Data Frame helps to maintain each numeric column which can be plotted on the graph. It is possible to use NumPy or Python objects, but pandas objects are preferable because the associated names will be used to annotate the axes. Parameters: x, y, hue: Inputs for plotting long-form data.
A violin plot depicts distributions of numeric data for one or more groups using density curves. The width of each curve corresponds with the approximate frequency of data points in each region. Densities are frequently accompanied by an overlaid chart type, such as box plot, to provide additional information.
This function creates simple violin plots by estimating the kernel density, using matlabs default ksdensity(). Given a matrix or table with m columns, you will get violins for each of the columns. Key Features: a) Specify plotting features as facecolor, edgecolor, etc.
To make a violin plot in R you can use ggplot2 and the geom_violin() function. For example, if we have the dataframe dataF and want to create a violin plot of the two groups response times you can use the following code: <code>p <- ggplot(aes(Group, RT), data = dataF))</code>.
data1 = (np.random.normal(0, 1, size=10000), np.random.normal(0, 2, size=10000))
data2 = (np.random.normal(1, 1, size=10000), np.random.normal(1, 2, size=10000))
fig, ax = plt.subplots(figsize=(18, 7))
v1 = ax.violinplot(data1, points=100, positions=np.arange(0, len(data1)),
showmeans=False, showextrema=False, showmedians=False)
for b in v1['bodies']:
# get the center
m = np.mean(b.get_paths()[0].vertices[:, 0])
# modify the paths to not go further right than the center
b.get_paths()[0].vertices[:, 0] = np.clip(b.get_paths()[0].vertices[:, 0], -np.inf, m)
b.set_color('r')
v2 = ax.violinplot(data2, points=100, positions=np.arange(0, len(data2)),
showmeans=False, showextrema=False, showmedians=False)
for b in v2['bodies']:
# get the center
m = np.mean(b.get_paths()[0].vertices[:, 0])
# modify the paths to not go further left than the center
b.get_paths()[0].vertices[:, 0] = np.clip(b.get_paths()[0].vertices[:, 0], m, np.inf)
b.set_color('b')
ax.legend([v1['bodies'][0],v2['bodies'][0]],['data1', 'data2'])
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With