Home > Software design >  Displaying a Matplotlib plot in Kivy without using the kivy-garden tools
Displaying a Matplotlib plot in Kivy without using the kivy-garden tools

Time:01-03

I am just learning to use Kivy and want to embed some plots from Matplotlib and potentially OpenGL graphics in an app. I was looking at this particular tutorial on how to use kivy-garden to display a Matplotlib plot

However, I was hoping someone might be able to point me to an example of importing a plot into Kivy without using the matplotlib kivy-garden widgets. I want to be a little plotting backend agnostic, and hence I wanted to learn to import plots directly into the Kivy widgets. Matplotlib will export an image from plt.show() so I imagine the corresponding Kivy widget needs to have a property that can receive images? Plotly exports something different, so I was hoping to understand how to directly import these different plots into Kivy.

If anyone knows some good examples of directly plotting into Kivy, it would be appreciated.

CodePudding user response:

You can load an Image. Here is an example hacked out of some code that I use.

kivy file:

#:kivy 2.0.0

<MatPlot>:

    Image:
        size_hint_x: 12
        source: root.matplotlib_image2.source
    Image:
        size_hint_x: 5
        source: root.matplotlib_image1.source

Python: my method on_start() probably needs to be called from some other code. I think the on_start is only intrinsic with App and not other widgets. I have used this with matplotlib which as you point out can export image files.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from pathlib import Path

from kivy.uix.image import Image
from kivy.uix.boxlayout import BoxLayout


# requires kivy element <MatPlot> from kv_mat_plot.kv
class MatPlot(BoxLayout):
    matplotlib_image1 = Image()
    matplotlib_image2 = Image()

    def __init__(self,
                 graph_directory: Path,
                 **kwargs,
                 ):

        super().__init__(**kwargs)

        self.graph_directory = graph_directory

    def load_image1(self, filename: str):
        self.matplotlib_image1.source = str(Path(self.graph_directory, filename))
        self.matplotlib_image1.reload()

    def load_image2(self, filename: str):
        self.matplotlib_image2.source = str(Path(self.graph_directory, filename))
        self.matplotlib_image2.reload()

    def reload_image2(self):
        self.matplotlib_image2.reload()
        print(f"imag2={self.matplotlib_image2.source}")

    def reload_image1(self):
        self.matplotlib_image1.reload()
        print(f"image1={self.matplotlib_image1.source}")

    def reload_images(self):
        self.reload_image2()
        self.reload_image1()

    def on_start(self):
        print(f"{self.name} on_start {self}")
        self.matplotlib_image2.source = str(Path(self.graph_directory, "one_image.png"))
        self.matplotlib_image1.source = str(Path(self.graph_directory, "second_image.png"))
  • Related