Script Kitty
Script Kitty

Reputation: 1747

Matplotlib how to dotplot variable number of points over time?

I'm trying to build an audiofingerprint algorithm like Shazam.

I have a variable length array of frequency point data like so:

[[69, 90, 172],
 [6, 18, 24],
 [6, 18],
 [6, 18, 24, 42],
 []
...

I would like to dotplot it like a spectrogram sort of like this. My data doesn't explicitly have a time series axes but each row is a 0.1s slice of time. I am aware of plt.specgram.

dotplot

Upvotes: 1

Views: 221

Answers (1)

JohanC
JohanC

Reputation: 80399

np.repeat can create an accompanying array of x's. It needs an array of sizes to be calculated from the input values.

Here is an example supposing the x's are .1 apart (like in the post's description, but unlike the example image).

import numpy as np
import matplotlib.pyplot as plt

# ys = [[69, 90, 172], [6, 18, 24], [6, 18], [6, 18, 24, 42]]
ys = [np.random.randint(50, 3500, np.random.randint(2, 6)) for _ in range(30)]
sizes = [len(y) for y in ys]
xs = [np.repeat(np.arange(.1, (len(ys) + .99) / 10, .1), sizes)]
plt.scatter(xs, np.concatenate(ys), marker='x', color='blueviolet')
plt.show()

example plot

Upvotes: 1

Related Questions