Created
September 27, 2018 04:42
-
-
Save eagleEggs/2acca6dbce4762aaadc60d3048f69266 to your computer and use it in GitHub Desktop.
plot PySimpleGUI
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import PySimpleGUI as sg | |
import matplotlib | |
matplotlib.use('TkAgg') | |
from matplotlib.backends.backend_tkagg import FigureCanvasAgg | |
import matplotlib.backends.tkagg as tkagg | |
import tkinter as Tk | |
""" | |
Demonstrates one way of embedding Matplotlib figures into a PySimpleGUI window. | |
Basic steps are: | |
* Create a Canvas Element | |
* Layout form | |
* Display form (NON BLOCKING) | |
* Draw plots onto convas | |
* Display form (BLOCKING) | |
""" | |
def draw_figure(canvas, figure, loc=(0, 0)): | |
""" Draw a matplotlib figure onto a Tk canvas | |
loc: location of top-left corner of figure on canvas in pixels. | |
Inspired by matplotlib source: lib/matplotlib/backends/backend_tkagg.py | |
""" | |
figure_canvas_agg = FigureCanvasAgg(figure) | |
figure_canvas_agg.draw() | |
figure_x, figure_y, figure_w, figure_h = figure.bbox.bounds | |
figure_w, figure_h = int(figure_w), int(figure_h) | |
photo = Tk.PhotoImage(master=canvas, width=figure_w, height=figure_h) | |
# Position: convert from top-left anchor to center anchor | |
canvas.create_image(loc[0] + figure_w/2, loc[1] + figure_h/2, image=photo) | |
# Unfortunately, there's no accessor for the pointer to the native renderer | |
tkagg.blit(photo, figure_canvas_agg.get_renderer()._renderer, colormode=2) | |
# Return a handle which contains a reference to the photo object | |
# which must be kept live or else the picture disappears | |
return photo | |
#------------------------------- PASTE YOUR MATPLOTLIB CODE HERE ------------------------------- | |
import numpy as np | |
import matplotlib.pyplot as plt | |
from matplotlib.ticker import NullFormatter # useful for `logit` scale | |
# Fixing random state for reproducibility | |
np.random.seed(19680801) | |
# make up some data in the interval ]0, 1[ | |
y = np.random.normal(loc=0.5, scale=0.4, size=1000) | |
y = y[(y > 0) & (y < 1)] | |
y.sort() | |
x = np.arange(len(y)) | |
# plot with various axes scales | |
plt.figure(1) | |
# linear | |
plt.subplot(221) | |
plt.plot(x, y) | |
plt.yscale('linear') | |
plt.title('linear') | |
plt.grid(True) | |
# log | |
plt.subplot(222) | |
plt.plot(x, y) | |
plt.yscale('log') | |
plt.title('log') | |
plt.grid(True) | |
# symmetric log | |
plt.subplot(223) | |
plt.plot(x, y - y.mean()) | |
plt.yscale('symlog', linthreshy=0.01) | |
plt.title('symlog') | |
plt.grid(True) | |
# logit | |
plt.subplot(224) | |
plt.plot(x, y) | |
plt.yscale('logit') | |
plt.title('logit') | |
plt.grid(True) | |
# Format the minor tick labels of the y-axis into empty strings with | |
# `NullFormatter`, to avoid cumbering the axis with too many labels. | |
plt.gca().yaxis.set_minor_formatter(NullFormatter()) | |
# Adjust the subplot layout, because the logit one may take more space | |
# than usual, due to y-tick labels like "1 - 10^{-3}" | |
plt.subplots_adjust(top=0.92, bottom=0.08, left=0.10, right=0.95, hspace=0.25, | |
wspace=0.35) | |
#------------------------------- END OF YOUR MATPLOTLIB CODE ------------------------------- | |
# ****** Comment out this line if not using Pyplot ****** | |
fig = plt.gcf() # if using Pyplot then get the figure from the plot | |
# -------------------------------- GUI Starts Here -------------------------------# | |
# fig = your figure you want to display. Assumption is that 'fig' holds the # | |
# information to display. # | |
# --------------------------------------------------------------------------------# | |
figure_x, figure_y, figure_w, figure_h = fig.bbox.bounds | |
# define the form layout | |
layout = [[sg.Text('Plot test')], | |
[sg.Canvas(size=(figure_w, figure_h), key='canvas')], | |
[sg.OK(pad=((figure_w / 2, 0), 3), size=(4, 2))]] | |
layout2 = [[sg.Text('Plot test')], | |
[sg.Canvas(size=(figure_w, figure_h), key='canvas')], | |
[sg.OK(pad=((figure_w / 2, 0), 3), size=(4, 2))]] | |
# create the form and show it without the plot | |
window = sg.Window('Demo Application - Embedding Matplotlib In PySimpleGUI').Layout(layout).Finalize() | |
window2 = sg.Window('Demo Application - Embedding Matplotlib In PySimpleGUI').Layout(layout2).Finalize() | |
# add the plot to the window | |
fig_photo = draw_figure(window2.FindElement('canvas').TKCanvas, fig) | |
# show it all again and get buttons | |
button, values = window.Read() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment