Merge pull request #4480 from PySimpleGUI/Dev-latest
New Matplotlib using Image Element demo - shows a Spectrogram
This commit is contained in:
		
						commit
						a6d277642e
					
				
					 1 changed files with 133 additions and 0 deletions
				
			
		
							
								
								
									
										133
									
								
								DemoPrograms/Demo_Matplotlib_Image_Elem.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										133
									
								
								DemoPrograms/Demo_Matplotlib_Image_Elem.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,133 @@ | |||
| import PySimpleGUI as sg | ||||
| import numpy as np | ||||
| from matplotlib.backends.backend_tkagg import FigureCanvasAgg | ||||
| import matplotlib.pyplot as plt | ||||
| import io | ||||
| 
 | ||||
| """ | ||||
|     Demo_Matplotlib_Image_Elem Demo | ||||
|      | ||||
|     Demo to show | ||||
|         * How to use an Image element to show a Matplotlib figure | ||||
|         * How to draw a Spectrogram | ||||
|         * Hide the Image when a figure isn't present (shrinks the window automatically) | ||||
|          | ||||
|     The example graph can be found in the matplotlib gallery: | ||||
|     https://matplotlib.org/stable/gallery/images_contours_and_fields/specgram_demo.html         | ||||
|      | ||||
|     Copyright 2021 PySimpleGUI | ||||
| """ | ||||
| 
 | ||||
| 
 | ||||
| # .d88888b    dP                       dP | ||||
| # 88.    "'   88                       88 | ||||
| # `Y88888b. d8888P .d8888b. 88d888b. d8888P | ||||
| #       `8b   88   88'  `88 88'  `88   88 | ||||
| # d8'   .8P   88   88.  .88 88         88 | ||||
| #  Y88888P    dP   `88888P8 dP         dP | ||||
| # oooooooooooooooooooooooooooooooooooooooooo of your Matplotlib code | ||||
| 
 | ||||
| 
 | ||||
| def your_matplotlib_code(): | ||||
|     # Fixing random state for reproducibility | ||||
|     np.random.seed(19680801) | ||||
| 
 | ||||
|     dt = 0.0005 | ||||
|     t = np.arange(0.0, 20.0, dt) | ||||
|     s1 = np.sin(2 * np.pi * 100 * t) | ||||
|     s2 = 2 * np.sin(2 * np.pi * 400 * t) | ||||
| 
 | ||||
|     # create a transient "chirp" | ||||
|     s2[t <= 10] = s2[12 <= t] = 0 | ||||
| 
 | ||||
|     # add some noise into the mix | ||||
|     nse = 0.01 * np.random.random(size=len(t)) | ||||
| 
 | ||||
|     x = s1 + s2 + nse  # the signal | ||||
|     NFFT = 1024  # the length of the windowing segments | ||||
|     Fs = int(1.0 / dt)  # the sampling frequency | ||||
| 
 | ||||
|     fig, (ax1, ax2) = plt.subplots(nrows=2) | ||||
|     ax1.plot(t, x) | ||||
|     Pxx, freqs, bins, im = ax2.specgram(x, NFFT=NFFT, Fs=Fs, noverlap=900) | ||||
| 
 | ||||
|     return fig | ||||
| 
 | ||||
| 
 | ||||
| #  88888888b                dP | ||||
| #  88                       88 | ||||
| #  88aaaa    88d888b. .d888b88 | ||||
| #  88        88'  `88 88'  `88 | ||||
| #  88        88    88 88.  .88 | ||||
| #  88888888P dP    dP `88888P8 | ||||
| # ooooooooooooooooooooooooooooo of your Matplotlib code | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| # dP     dP           dP | ||||
| # 88     88           88 | ||||
| # 88aaaaa88a .d8888b. 88  88d888b. .d8888b. 88d888b. | ||||
| # 88     88  88ooood8 88  88'  `88 88ooood8 88'  `88 | ||||
| # 88     88  88.  ... 88  88.  .88 88.  ... 88 | ||||
| # dP     dP  `88888P' dP  88Y888P' `88888P' dP | ||||
| # ooooooooooooooooooooooo~88~oooooooooooooooooooooooo function | ||||
| #                         dP | ||||
| 
 | ||||
| def draw_figure(element, figure): | ||||
|     """ | ||||
|     Draws the previously created "figure" in the supplied Image Element | ||||
| 
 | ||||
|     :param element: an Image Element | ||||
|     :param figure: a Matplotlib figure | ||||
|     :return: The figure canvas | ||||
|     """ | ||||
| 
 | ||||
|     plt.close('all')  # erases previously drawn plots | ||||
|     canv = FigureCanvasAgg(figure) | ||||
|     buf = io.BytesIO() | ||||
|     canv.print_figure(buf, format='png') | ||||
|     if buf is None: | ||||
|         return None | ||||
|     buf.seek(0) | ||||
|     element.update(data=buf.read(), visible=True) | ||||
|     return canv | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #  .88888.  dP     dP dP | ||||
| # d8'   `88 88     88 88 | ||||
| # 88        88     88 88 | ||||
| # 88   YP88 88     88 88 | ||||
| # Y8.   .88 Y8.   .8P 88 | ||||
| #  `88888'  `Y88888P' dP | ||||
| # ooooooooooooooooooooooo | ||||
| 
 | ||||
| 
 | ||||
| def main(): | ||||
|     # define the window layout | ||||
|     layout = [[sg.Text('Spectrogram test')], | ||||
|               [sg.pin(sg.Image(key='-IMAGE-'))], | ||||
|               [sg.Button('Ok'), sg.B('Clear')]] | ||||
| 
 | ||||
|     # create the form and show it without the plot | ||||
|     window = sg.Window('Spectrogram', layout, element_justification='c', font='Helvetica 14') | ||||
| 
 | ||||
|     while True: | ||||
|         # add the plot to the window | ||||
|         event, values = window.read() | ||||
|         if event == sg.WIN_CLOSED: | ||||
|             break | ||||
|         elif event == 'Ok': | ||||
|             draw_figure(window['-IMAGE-'], your_matplotlib_code()) | ||||
|         elif event == 'Clear': | ||||
|             plt.close('all')                                # close all plots | ||||
|             window['-IMAGE-'].update()                      # clears the image | ||||
|             window['-IMAGE-'].update(visible=False)         # hides the blank image | ||||
| 
 | ||||
| 
 | ||||
|     window.close() | ||||
| 
 | ||||
| 
 | ||||
| if __name__ == '__main__': | ||||
|     main() | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue