Python Kivy 使用 Matplotlib 绘制实时图形(尺寸太小)

2024-02-28

我正在尝试使用 kivy Garden matplotlib 在 kivy 内创建测量可视化。目标是绘制字典中的变量及其相关测量值。

目前代码(见下文)由 3 部分组成。在导入部分之后,我定义了在代码中使用的常量。下一部分是一个字典,我用它以编程方式绘制具有不同设置(线条颜色、线条宽度等)的不同变量。从字典之后开始,我定义了一个方法切片数组来拼接数组以减少内存使用,并定义了一个类 Plots 来生成绘图。我还发了一个类似的问题 https://stackoverflow.com/questions/52200823/python-kivy-plots-with-meshlineplot-confusion但通过使用猕猴桃花园图。

我的代码有两个问题。首先,我不可能在没有的情况下显示坐标系。 ax.spines 命令没有任何效果。第二个问题是,我实际上希望能够绘制任意数量的变量,并将其显示在单独的子图中。我希望图形在显示屏上具有恒定的高度。这应该会导致滚动绘图的可能性。

import time
import psutil
import matplotlib.pyplot as plt

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.clock import Clock
from kivy.uix.scrollview import ScrollView
from kivy.uix.widget import Widget

from kivy.garden.matplotlib.backend_kivyagg import FigureCanvasKivyAgg

# Chart Constants
MAX_MEASUREMENT_ARRAY_LENGTH = 500      # to trim measured values values
X_BASE_INTERVAL_LENGTH = 10             # time axis is displayed for an interval of 50 seconds
BASE_LINE_WIDTH = 0.5                   # line width of lines in plots
BASE_LINE_COLOR = "white"
COLUMNS_OF_PLOTS = 1                    # TODO implement more general layout possibilities, at the moment only 1-column

chart_variables = {
    "cpu_usage": {
        "order_number": 1,
        "title": "CPU Usage",
        "color": BASE_LINE_COLOR,
        "line_width": BASE_LINE_WIDTH,
        "x_interval_length": X_BASE_INTERVAL_LENGTH,
        "y_bottom": 0,
        "y_top": 100,
        "x_label": "Time in epochs",
        "y_label": "CPU usage in %",
        "x_values": [],
        "y_values": [],
        "anti_aliased": False,
    },

    "upc_usage": {
        "order_number": 2,
        "title": "UPC Usage",
        "color": BASE_LINE_COLOR,
        "line_width": BASE_LINE_WIDTH,
        "x_interval_length": X_BASE_INTERVAL_LENGTH,
        "y_bottom": 0,
        "y_top": 100,
        "x_label": "Time in epochs",
        "y_label": "UPC usage in %",
        "x_values": [],
        "y_values": [],
        "anti_aliased": True,
    },

    "test3": {
        "order_number": 3,
        "title": "test",
        "color": BASE_LINE_COLOR,
        "line_width": BASE_LINE_WIDTH,
        "x_interval_length": X_BASE_INTERVAL_LENGTH,
        "y_bottom": 0,
        "y_top": 100,
        "x_label": "Time in epochs",
        "y_label": "UPC usage in %",
        "x_values": [],
        "y_values": [],
        "anti_aliased": True,
    },

    "test4": {
        "order_number": 4,
        "title": "test",
        "color": BASE_LINE_COLOR,
        "line_width": BASE_LINE_WIDTH,
        "x_interval_length": X_BASE_INTERVAL_LENGTH,
        "y_bottom": 0,
        "y_top": 100,
        "x_label": "Time in epochs",
        "y_label": "UPC usage in %",
        "x_values": [],
        "y_values": [],
        "anti_aliased": True,
    },

    "test5": {
        "order_number": 5,
        "title": "test",
        "color": BASE_LINE_COLOR,
        "line_width": BASE_LINE_WIDTH,
        "x_interval_length": X_BASE_INTERVAL_LENGTH,
        "y_bottom": 0,
        "y_top": 100,
        "x_label": "Time in epochs",
        "y_label": "UPC usage in %",
        "x_values": [],
        "y_values": [],
        "anti_aliased": True,
    },

    "test6": {
        "order_number": 6,
        "title": "test",
        "color": BASE_LINE_COLOR,
        "line_width": BASE_LINE_WIDTH,
        "x_interval_length": X_BASE_INTERVAL_LENGTH,
        "y_bottom": 0,
        "y_top": 100,
        "x_label": "Time in epochs",
        "y_label": "UPC usage in %",
        "x_values": [],
        "y_values": [],
        "anti_aliased": True,
    },
}


def slice_arrays(max_array_length):
    if len(chart_variables["cpu_usage"]["x_values"]) > max_array_length:
        for key in chart_variables:
            chart_variables[key]["x_values"] = chart_variables[key]["x_values"][int(max_array_length / 2):]
            chart_variables[key]["y_values"] = chart_variables[key]["y_values"][int(max_array_length / 2):]


class Plots(Widget):
    def __init__(self):
        super(Plots, self).__init__()
        self.number_of_plots = len(chart_variables)
        self.t_start = time.time()
        self.chart, self.axes = plt.subplots(nrows=self.number_of_plots,
                                             ncols=COLUMNS_OF_PLOTS,
                                             facecolor=(0.9, 0.9, 0.9))
        plt.subplots_adjust(hspace=0.01)
        self.chart.patch.set_alpha(0)  # transparent plot background

    def initialize_plots(self):
        for ax, key in zip(self.axes.flat, chart_variables):
            ax.set_title(chart_variables[key]["title"], color=chart_variables[key]["color"])
            ax.tick_params(labelcolor=chart_variables[key]["color"])
            ax.set_xlabel(chart_variables[key]["x_label"], color=chart_variables[key]["color"])
            ax.set_ylabel(chart_variables[key]["y_label"], color=chart_variables[key]["color"])
            ax.set_ylim(bottom=chart_variables[key]["y_bottom"],
                        top=chart_variables[key]["y_top"])
            ax.set_frame_on(False)  # remove white background inside each subplot
            ax.spines['bottom'].set_color('white')
            ax.spines['left'].set_color('white')

    def plot_data(self):
        slice_arrays(MAX_MEASUREMENT_ARRAY_LENGTH)
        for ax, key in zip(self.axes.flat, chart_variables):
            x_axis_interval_length = chart_variables[key]["x_interval_length"]
            elapsed_time = time.time() - self.t_start
            number_of_intervals = elapsed_time // x_axis_interval_length  # index 0 to get div part only
            chart_variables[key]["x_values"].append(elapsed_time)
            chart_variables[key]["y_values"].append(psutil.cpu_percent())
            ax.plot(chart_variables[key]["x_values"],
                    chart_variables[key]["y_values"],
                    color=chart_variables[key]["color"],
                    linewidth=chart_variables[key]["line_width"],
                    antialiased=chart_variables[key]["anti_aliased"])
            self.chart.canvas.draw()
            x_left = x_axis_interval_length * number_of_intervals
            x_right = x_axis_interval_length * (number_of_intervals + 1)
            ax.set_xlim(left=x_left, right=x_right)

    def update_plots(self, _):
        self.plot_data()


class MyApp(App):

    def build(self):
        plot = Plots()
        plot.initialize_plots()
        Clock.schedule_interval(plot.update_plots, 0.2)
        scroll_view = ScrollView()
        box = BoxLayout()
        box.spacing = 24
        scroll_view.add_widget(box)
        box.add_widget(FigureCanvasKivyAgg(plt.gcf()))
        return scroll_view


if __name__ == "__main__":
    MyApp().run()

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python Kivy 使用 Matplotlib 绘制实时图形(尺寸太小) 的相关文章

随机推荐

  • 反应变化最小/最大范围+ 2个数据帧闪亮

    我的 Shiny 应用程序有一个问题 首先 我有两个dataframes其中有两个numeric列 number and number2 我也有动态用户界面sliderInput 闪亮的应用程序工作正常 直到 当我选择时Item数据框 选择
  • 如何将 UITableView 行重新排序限制为一个部分

    我正为这个问题碰头 谷歌却什么也没找到 我最终解决了这个问题 并想把它写在这里是为了下一个人 你有一个UITableView有多个部分 每个部分都是同质的 但整个表是异构的 因此 您可能希望允许对节内的行重新排序 但不允许across部分
  • 我是否需要定义巨大的 VPC 子网才能并行运行许多 Lambda 函数?

    我读到每个 AWS Lambda 调用都会获得自己的私有 IP 在 VPC 中运行时 这是否意味着如果我想要并行运行 50 000 个 Lambda 我需要它在具有 50 000 个可用私有 IP 的 VPC 子网中运行 简短 更新 答案
  • UICollectionView 的分页

    我使用 UICollectionView 创建了数据表视图 这是代码 class PanelViewController UIViewController var TableHeaderArray NSMutableArray var Ta
  • 如何在 C++ 11 中迭代 std::tuple [重复]

    这个问题在这里已经有答案了 我制作了以下元组 我想知道我应该如何迭代它 有tupl size 但是阅读文档 我不知道如何使用它 我也有搜索 但问题似乎存在Boost tuple auto some make tuple I am good
  • NetSqlAzMan vs AzMan vs (??????)

    我一直在尝试 从字里行间解读 NetSqlAzMan 项目的原始 和 或当前 动机 这是写的吗 Windows 授权管理器 AzMan 的适配器 NetSqlAzMan 中的方法只是将调用传递给 Windows 授权管理器 AzMan 但可
  • 将 C++ 向量初始化为随机值...快速

    嘿 我想尽可能快地做到这一点 因为它在我正在编写的程序中被多次调用 所以有没有比以下更快的方法将 C 向量初始化为随机值 double range set to the range of a particular function i wa
  • SVG 元素上的 CSS 转换 IE9+

    拥有 SVG 路径
  • C++:如何在不使用 sprintf 的情况下将 fprintf 结果作为 std::string 获取

    我正在使用一个用 C 实现的开源 UNIX 工具 我需要更改一些代码以使其执行我想要的操作 我想做尽可能小的改变 希望我的补丁能够被上游接受 首选可在标准 C 中实现且不会创建更多外部依赖项的解决方案 这是我的问题 我有一个 C 类 我们称
  • 在Python中比较两个浮点数是否相等[重复]

    这个问题在这里已经有答案了 当在Python中比较两个浮点数时 我看到代码总是这样来比较小值epsilon 想知道选择正确的epsilon值的最佳实践是什么 而其背后的场景又是怎样的呢 谢谢 epsilon 0 000001 abs a b
  • 窗口.print();不适用于 Safari

    使用 onclick 链接 Safari 时 打印方法在窗口上不起作用 在 Safari 中通过放置在按钮上的 onclick 代码打印网页的替代方法是什么 发生的另一个奇怪的行为是 当我尝试关闭窗口时 浏览器本机的打印对话框就会出现 尝试
  • 如何将文件从Windows主机复制到Docker容器

    正在寻找将本地文件复制到 Windows 上的 Docker 容器的快速解决方案 我在其他 Stack Overflow 解决方案中找不到这个 您可以将此称为在 Docker 容器内安装 Windows 上的本地驱动器 从任务栏上的图标打开
  • 在 Perl 中如何将变量限定为 const/final?

    例如 在下面的情况下 我不想更改 infilename初始化后程序中的任何位置 my infilename input 56 12 txt open my fpin lt infilename or die print infilename
  • CDT 在“设置索引器”期间发生内部错误

    我使用 Eclipse 和 CDT 来构建 C 代码 加载我的工作区后 我收到以下消息 An internal error occurred during Setting up indexer 这是日志 eclipse buildId I2
  • Resharper 重新格式化 Linq 语句以在同一行中放入和选择

    当我输入 Linq 查询样式语句时 例如 var stuff from x in things group x by x Something into g select g Resharper 正在将其重新格式化为 var stuff fr
  • 如何使用 MuPDF 在受密码保护的 pdf 上保存注释

    我正在尝试保存受密码保护的 pdf 的注释 我能够绘制注释并保存它 但是 一旦我返回并再次进行活动 我就看不到我的注释 然而奇怪的是 我可以看到注释框 但看不到绘制的路径 它适用于普通 pdf 无密码 pdf 知道如何保存受密码保护的 pd
  • R 的最佳 IDE/文本编辑器 [重复]

    这个问题在这里已经有答案了 可能的重复 Linux 中的 R 有哪些可用的 IDE https stackoverflow com questions 1097367 what ides are available for r in lin
  • 为什么浏览器不要求记住密码? [复制]

    这个问题在这里已经有答案了 您需要在登录表单上做什么 以便浏览器提示记住登录信息 我有一个名为 用户名 的输入和一个名为 密码 的输入 在我的浏览器上 我将其设置为询问是否应该记住密码 并且在大多数网站上都会这样做 但在我正在测试的网站上却
  • 如何在 VS Code 1.57 中禁用工作区信任?

    我刚刚更新到 VS Code 1 57 现在收到关于信任我的工作区的提示 我怎样才能禁用它并恢复到旧的行为 在完全禁用受信任的工作区之前 请确保您了解什么是可信工作空间以及为什么它们会有所帮助 https code visualstudio
  • Python Kivy 使用 Matplotlib 绘制实时图形(尺寸太小)

    我正在尝试使用 kivy Garden matplotlib 在 kivy 内创建测量可视化 目标是绘制字典中的变量及其相关测量值 目前代码 见下文 由 3 部分组成 在导入部分之后 我定义了在代码中使用的常量 下一部分是一个字典 我用它以