Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Seaborn violin plot over time given numpy ndarray

I have a distribution that changes over time for which I would like to plot a violin plot for each time step side-by-side using seaborn. My initial attempt failed as violinplot cannot handle a np.ndarray for the y argument:

import numpy as np
import seaborn as sns

time = np.arange(0, 10)
samples = np.random.randn(10, 200)

ax = sns.violinplot(x=time, y=samples)  # Exception: Data must be 1-dimensional

The seaborn documentation has an example for a vertical violinplot grouped by a categorical variable. However, it uses a DataFrame in long format.

Do I need to convert my time series into a DataFrame as well? If so, how do I achieve this?

like image 544
smonsays Avatar asked Oct 29 '25 22:10

smonsays


2 Answers

A closer look at the documentation made me realize that omitting the x and y argument altogether leads to the data argument being interpreted in wide-form:

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt


samples = np.random.randn(20, 10)
ax = sns.violinplot(data=samples)
plt.show()

Violin plot over time

like image 114
smonsays Avatar answered Oct 31 '25 13:10

smonsays


In the violin plot documentation it says that the input x and y parameters do not have to be a data frame, but they have a restriction of having the same dimension. In addition, the variable y that you created has 10 rows and 200 columns. This is detrimental when plotting the graphics and causes a dimension problem. I tested it and this code has no problems when reading the python file.

import numpy as np
import seaborn as sns
import pandas as pd

time = np.arange(0, 200)
samples = np.random.randn(10, 200)

for sample in samples:
    ax = sns.violinplot(x=time, y=sample)

You can then group the resulting graphs using this link: https://python-graph-gallery.com/199-matplotlib-style-sheets/

If you want to convert your data into data frames it is also possible. You just need to use pandas.

example

import pandas as pd
x = [1,2,3,4]
df = pd.DataFrame(x)
like image 37
matheus1714 Avatar answered Oct 31 '25 12:10

matheus1714



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!