Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Matplotlib eventplot - raster plot from binary values

I have created a dataframe where each column is an equal-length series of 1.0s and 0.0s. There is nothing else in the dataframe. I want to create a raster-style plot from this data where each column would be a horizontal line stacked up along the y-axis and each tick on the x-axis would correspond to a row index value.

However, when I try to do this, I get an "axis -1 is out of bounds for array of dimension 0" error. None of the other entries for this or very similar errors seem to relate to eventplot. I thought the type of data I had would be perfect for eventplot (a discrete black dash wherever there's a 1.0, otherwise nothing), but maybe I'm very wrong.

Here's a toy example of the kind of dataframe I'm trying to pass plus the function as I'm calling it:

    SP1     SP3     SP5     SP7     SP9     SP11
0   1.0     0.0     0.0     0.0     0.0     0.0
1   0.0     0.0     0.0     1.0     0.0     0.0
2   0.0     0.0     0.0     0.0     0.0     0.0
3   0.0     1.0     0.0     0.0     0.0     0.0
4   0.0     0.0     1.0     0.0     1.0     0.0
5   0.0     1.0     0.0     0.0     1.0     1.0


plt.eventplot(df, colors='black', lineoffsets=1,
                    linelengths=1, orientation='vertical')

Any help appreciated, thank you.

Edit: If I convert my df into an np.array and pass that instead, I no longer get that particular error, but I don't at all get the result I'm looking for. I do get the correct values on the x-axis (in my real data, this is 0-22), but I don't get each column of data represented as a separate line, and I'm having no luck advancing in that direction. enter image description here

like image 525
cjstevens Avatar asked Oct 17 '25 21:10

cjstevens


1 Answers

When using eventplot, the array passed to positions needs to contain the row numbers of the ones in each column. Here is an example with your toy data:

import io
import pandas as pd              # v 1.2.3
import matplotlib.pyplot as plt  # v 3.3.4

# Import data into dataframe
data = """
SP1     SP3     SP5     SP7     SP9     SP11
0   1.0     0.0     0.0     0.0     0.0     0.0
1   0.0     0.0     0.0     1.0     0.0     0.0
2   0.0     0.0     0.0     0.0     0.0     0.0
3   0.0     1.0     0.0     0.0     0.0     0.0
4   0.0     0.0     1.0     0.0     1.0     0.0
5   0.0     1.0     0.0     0.0     1.0     1.0
"""
df = pd.read_csv(io.StringIO(data), delim_whitespace=True)

# Create series of indexes containing positions for raster plot
positions = df.apply(lambda x: df.index[x == 1])

# Create raster plot with inverted y-axis to display columns in ascending order
plt.eventplot(positions, lineoffsets=df.index, linelengths=0.75, colors='black')
plt.yticks(range(positions.index.size), positions.index)
plt.gca().invert_yaxis()

eventplot

like image 86
Patrick FitzGerald Avatar answered Oct 19 '25 13:10

Patrick FitzGerald



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!