├── .gitignore ├── IMF2RecPlot.py ├── README.md ├── examples ├── chainsaw │ ├── chainsaw.npy │ ├── images │ │ ├── chainsaw_imfR_0.png │ │ ├── chainsaw_imfR_1.png │ │ ├── chainsaw_imfR_2.png │ │ ├── chainsaw_imfR_3.png │ │ ├── chainsaw_imfR_4.png │ │ ├── chainsaw_imfR_5.png │ │ ├── chainsaw_imfS0.png │ │ ├── chainsaw_imfS1.png │ │ ├── chainsaw_imfS2.png │ │ ├── chainsaw_imfS3.png │ │ ├── chainsaw_imfS4.png │ │ ├── chainsaw_imfS5.png │ │ ├── chainsaw_imfs.png │ │ ├── chainsaw_orgRec.png │ │ └── chainsaworgSig.png │ └── wavs │ │ ├── chainsaw.wav │ │ ├── chainsaw_imfW0.wav │ │ ├── chainsaw_imfW1.wav │ │ ├── chainsaw_imfW2.wav │ │ ├── chainsaw_imfW3.wav │ │ ├── chainsaw_imfW4.wav │ │ └── chainsaw_imfW5.wav └── disconnect │ ├── disconnect.npy │ ├── images │ ├── disconnect_imfR_0.png │ ├── disconnect_imfR_1.png │ ├── disconnect_imfR_2.png │ ├── disconnect_imfR_3.png │ ├── disconnect_imfR_4.png │ ├── disconnect_imfR_5.png │ ├── disconnect_imfS0.png │ ├── disconnect_imfS1.png │ ├── disconnect_imfS2.png │ ├── disconnect_imfS3.png │ ├── disconnect_imfS4.png │ ├── disconnect_imfS5.png │ ├── disconnect_imfs.png │ ├── disconnect_orgRec.png │ └── disconnectorgSig.png │ └── wavs │ ├── disconnect.wav │ ├── disconnect_imfW0.wav │ ├── disconnect_imfW1.wav │ ├── disconnect_imfW2.wav │ ├── disconnect_imfW3.wav │ ├── disconnect_imfW4.wav │ └── disconnect_imfW5.wav └── plot_recurrence.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | 27 | # PyInstaller 28 | # Usually these files are written by a python script from a template 29 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 30 | *.manifest 31 | *.spec 32 | 33 | # Installer logs 34 | pip-log.txt 35 | pip-delete-this-directory.txt 36 | 37 | # Unit test / coverage reports 38 | htmlcov/ 39 | .tox/ 40 | .coverage 41 | .coverage.* 42 | .cache 43 | nosetests.xml 44 | coverage.xml 45 | *,cover 46 | .hypothesis/ 47 | 48 | # Translations 49 | *.mo 50 | *.pot 51 | 52 | # Django stuff: 53 | *.log 54 | local_settings.py 55 | 56 | # Flask stuff: 57 | instance/ 58 | .webassets-cache 59 | 60 | # Scrapy stuff: 61 | .scrapy 62 | 63 | # Sphinx documentation 64 | docs/_build/ 65 | 66 | # PyBuilder 67 | target/ 68 | 69 | # IPython Notebook 70 | .ipynb_checkpoints 71 | 72 | # pyenv 73 | .python-version 74 | 75 | # celery beat schedule file 76 | celerybeat-schedule 77 | 78 | # dotenv 79 | .env 80 | 81 | # virtualenv 82 | venv/ 83 | ENV/ 84 | 85 | # Spyder project settings 86 | .spyderproject 87 | 88 | # Rope project settings 89 | .ropeproject 90 | -------------------------------------------------------------------------------- /IMF2RecPlot.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on Mon Jun 10 08:33:53 2013 4 | 5 | @author: jz026613 6 | """ 7 | from __future__ import division 8 | import numpy as np 9 | import pylab as plt 10 | import os 11 | from plot_recurrence import rec_plot 12 | 13 | example = 'chainsaw' # 'chainsaw', 'disconnect' 14 | os.chdir(os.path.join('examples', example)) 15 | 16 | IMF = np.load(example+'.npy') 17 | S = np.sum(IMF, axis=0) 18 | t = np.arange(0, S.size).astype(np.float32) 19 | 20 | # Params 21 | eps = 0.005 22 | steps = 20 23 | if example == 'disconnect': 24 | n_start, N = 2000, 5000 25 | else: 26 | n_start, N = 15000, 3000 27 | 28 | norm = lambda X: (X-X.mean())/np.max(np.abs(X-X.mean())) 29 | 30 | # From now on everythin is in images dir 31 | os.chdir('images') 32 | 33 | # Plot recurrence plot 34 | print("Original signal - recurrence plot") 35 | 36 | fig = plt.figure() 37 | rec = rec_plot(norm(S)[n_start:n_start+N], eps=eps, steps=steps) 38 | plt.imshow(rec, extent=[n_start,n_start+N,n_start+N,n_start]) 39 | plt.savefig(example+'_orgRec',dpi=200) 40 | plt.close() 41 | 42 | # Plot each imf figure 43 | for imfNum in range(IMF.shape[0]): 44 | 45 | F = IMF[imfNum] 46 | fNorm = norm(F) 47 | 48 | # Plot recurrence plot 49 | print("IMF %i - recurrence plot" %imfNum) 50 | fig = plt.figure() 51 | rp = rec_plot(fNorm[n_start:n_start+N], eps=eps, steps=steps) 52 | plt.imshow(rp,extent=[n_start,n_start+N,n_start+N,n_start]) 53 | plt.savefig(example+'_imfR_'+str(imfNum),dpi=200) 54 | 55 | plt.close() 56 | 57 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Shortly 2 | Tools for creating recurrence plot. 3 | 4 | # Instruction 5 | See `plot_recurrance.py` for example on how to use it. 6 | Here is quick small suggestion: 7 | ```python 8 | import numpy as np 9 | import pylab as plt 10 | from plot_recurrance import rec_plot 11 | 12 | sig = np.random.uniform(size=100) 13 | rec = rec_plot(sig) 14 | plt.imshow(rec) 15 | plt.show() 16 | ``` 17 | Few inspirational plots below. 18 | 19 | # Blog post with description: 20 | Small blog post on using visualising Intrinsic Mode Frequency (IMFs), i.e. output of Empirical Mode Decomposition, can be found here: [EMD on Audio wav and reccurance plots](https://laszukdawid.com/2015/09/04/emd-on-audio-wav-and-recurrance-plots/) 21 | 22 | # Cool-looking plots 23 | ![rec1](examples/chainsaw/images/chainsaw_imfR_3.png?raw=true "Reccurance plot of an IMF") 24 | ![rec2](examples/disconnect/images/disconnect_imfR_5.png?raw=true "Reccurance plot of an IMF") 25 | -------------------------------------------------------------------------------- /examples/chainsaw/chainsaw.npy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/chainsaw/chainsaw.npy -------------------------------------------------------------------------------- /examples/chainsaw/images/chainsaw_imfR_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/chainsaw/images/chainsaw_imfR_0.png -------------------------------------------------------------------------------- /examples/chainsaw/images/chainsaw_imfR_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/chainsaw/images/chainsaw_imfR_1.png -------------------------------------------------------------------------------- /examples/chainsaw/images/chainsaw_imfR_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/chainsaw/images/chainsaw_imfR_2.png -------------------------------------------------------------------------------- /examples/chainsaw/images/chainsaw_imfR_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/chainsaw/images/chainsaw_imfR_3.png -------------------------------------------------------------------------------- /examples/chainsaw/images/chainsaw_imfR_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/chainsaw/images/chainsaw_imfR_4.png -------------------------------------------------------------------------------- /examples/chainsaw/images/chainsaw_imfR_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/chainsaw/images/chainsaw_imfR_5.png -------------------------------------------------------------------------------- /examples/chainsaw/images/chainsaw_imfS0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/chainsaw/images/chainsaw_imfS0.png -------------------------------------------------------------------------------- /examples/chainsaw/images/chainsaw_imfS1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/chainsaw/images/chainsaw_imfS1.png -------------------------------------------------------------------------------- /examples/chainsaw/images/chainsaw_imfS2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/chainsaw/images/chainsaw_imfS2.png -------------------------------------------------------------------------------- /examples/chainsaw/images/chainsaw_imfS3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/chainsaw/images/chainsaw_imfS3.png -------------------------------------------------------------------------------- /examples/chainsaw/images/chainsaw_imfS4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/chainsaw/images/chainsaw_imfS4.png -------------------------------------------------------------------------------- /examples/chainsaw/images/chainsaw_imfS5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/chainsaw/images/chainsaw_imfS5.png -------------------------------------------------------------------------------- /examples/chainsaw/images/chainsaw_imfs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/chainsaw/images/chainsaw_imfs.png -------------------------------------------------------------------------------- /examples/chainsaw/images/chainsaw_orgRec.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/chainsaw/images/chainsaw_orgRec.png -------------------------------------------------------------------------------- /examples/chainsaw/images/chainsaworgSig.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/chainsaw/images/chainsaworgSig.png -------------------------------------------------------------------------------- /examples/chainsaw/wavs/chainsaw.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/chainsaw/wavs/chainsaw.wav -------------------------------------------------------------------------------- /examples/chainsaw/wavs/chainsaw_imfW0.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/chainsaw/wavs/chainsaw_imfW0.wav -------------------------------------------------------------------------------- /examples/chainsaw/wavs/chainsaw_imfW1.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/chainsaw/wavs/chainsaw_imfW1.wav -------------------------------------------------------------------------------- /examples/chainsaw/wavs/chainsaw_imfW2.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/chainsaw/wavs/chainsaw_imfW2.wav -------------------------------------------------------------------------------- /examples/chainsaw/wavs/chainsaw_imfW3.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/chainsaw/wavs/chainsaw_imfW3.wav -------------------------------------------------------------------------------- /examples/chainsaw/wavs/chainsaw_imfW4.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/chainsaw/wavs/chainsaw_imfW4.wav -------------------------------------------------------------------------------- /examples/chainsaw/wavs/chainsaw_imfW5.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/chainsaw/wavs/chainsaw_imfW5.wav -------------------------------------------------------------------------------- /examples/disconnect/disconnect.npy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/disconnect/disconnect.npy -------------------------------------------------------------------------------- /examples/disconnect/images/disconnect_imfR_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/disconnect/images/disconnect_imfR_0.png -------------------------------------------------------------------------------- /examples/disconnect/images/disconnect_imfR_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/disconnect/images/disconnect_imfR_1.png -------------------------------------------------------------------------------- /examples/disconnect/images/disconnect_imfR_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/disconnect/images/disconnect_imfR_2.png -------------------------------------------------------------------------------- /examples/disconnect/images/disconnect_imfR_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/disconnect/images/disconnect_imfR_3.png -------------------------------------------------------------------------------- /examples/disconnect/images/disconnect_imfR_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/disconnect/images/disconnect_imfR_4.png -------------------------------------------------------------------------------- /examples/disconnect/images/disconnect_imfR_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/disconnect/images/disconnect_imfR_5.png -------------------------------------------------------------------------------- /examples/disconnect/images/disconnect_imfS0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/disconnect/images/disconnect_imfS0.png -------------------------------------------------------------------------------- /examples/disconnect/images/disconnect_imfS1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/disconnect/images/disconnect_imfS1.png -------------------------------------------------------------------------------- /examples/disconnect/images/disconnect_imfS2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/disconnect/images/disconnect_imfS2.png -------------------------------------------------------------------------------- /examples/disconnect/images/disconnect_imfS3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/disconnect/images/disconnect_imfS3.png -------------------------------------------------------------------------------- /examples/disconnect/images/disconnect_imfS4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/disconnect/images/disconnect_imfS4.png -------------------------------------------------------------------------------- /examples/disconnect/images/disconnect_imfS5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/disconnect/images/disconnect_imfS5.png -------------------------------------------------------------------------------- /examples/disconnect/images/disconnect_imfs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/disconnect/images/disconnect_imfs.png -------------------------------------------------------------------------------- /examples/disconnect/images/disconnect_orgRec.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/disconnect/images/disconnect_orgRec.png -------------------------------------------------------------------------------- /examples/disconnect/images/disconnectorgSig.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/disconnect/images/disconnectorgSig.png -------------------------------------------------------------------------------- /examples/disconnect/wavs/disconnect.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/disconnect/wavs/disconnect.wav -------------------------------------------------------------------------------- /examples/disconnect/wavs/disconnect_imfW0.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/disconnect/wavs/disconnect_imfW0.wav -------------------------------------------------------------------------------- /examples/disconnect/wavs/disconnect_imfW1.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/disconnect/wavs/disconnect_imfW1.wav -------------------------------------------------------------------------------- /examples/disconnect/wavs/disconnect_imfW2.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/disconnect/wavs/disconnect_imfW2.wav -------------------------------------------------------------------------------- /examples/disconnect/wavs/disconnect_imfW3.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/disconnect/wavs/disconnect_imfW3.wav -------------------------------------------------------------------------------- /examples/disconnect/wavs/disconnect_imfW4.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/disconnect/wavs/disconnect_imfW4.wav -------------------------------------------------------------------------------- /examples/disconnect/wavs/disconnect_imfW5.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laszukdawid/recurrence-plot/f99605bc010a03dbae6077a29f51ff6b166310c8/examples/disconnect/wavs/disconnect_imfW5.wav -------------------------------------------------------------------------------- /plot_recurrence.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | # coding: UTF-8 3 | from __future__ import division, print_function 4 | import numpy as np 5 | import pylab as plt 6 | from scipy.spatial.distance import pdist, squareform 7 | 8 | def rec_plot(s, eps=0.10, steps=10): 9 | d = pdist(s[:,None]) 10 | d = np.floor(d/eps) 11 | d[d>steps] = steps 12 | Z = squareform(d) 13 | return Z 14 | 15 | def moving_average(s, r=5): 16 | return np.convolve(s, np.ones((r,))/r, mode='valid') 17 | 18 | if __name__ == "__main__": 19 | # Generate singal 20 | N = 200 21 | eps = 0.1 22 | steps = 10 23 | 24 | # Plot unifrom dist filtered with moving average 25 | ru = np.random.uniform(low=-1, high=1, size=N) 26 | ru_filtered = moving_average(ru) 27 | 28 | plt.title("Normal") 29 | plt.subplot(221) 30 | plt.plot(ru_filtered) 31 | plt.title("Unitary") 32 | plt.subplot(223) 33 | plt.imshow(rec_plot(ru_filtered, eps=eps, steps=steps)) 34 | 35 | # Plot normal dist filtered with moving average 36 | rn = np.random.normal(size=N) 37 | rn_filtered = moving_average(rn) 38 | 39 | plt.subplot(222) 40 | plt.plot(rn_filtered) 41 | plt.title("Normal") 42 | plt.subplot(224) 43 | plt.imshow(rec_plot(rn_filtered, eps=eps, steps=steps)) 44 | 45 | plt.show() 46 | --------------------------------------------------------------------------------