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 绘制实时图形(尺寸太小) 的相关文章

  • 类的 IPython 表示

    我正在使用我创建的模块尝试 IPython 但它没有显示类对象的实际表示 相反 它显示类似的内容 TheClass module TheClass name I heavily在这个模块中使用元类 我有真正有意义的类表示 应该向用户显示 是
  • Python - 比较同一字典中的值

    我有一本字典 d Trump MAGA FollowTheMoney Clinton dems Clinton Stein FollowTheMoney Atlanta 我想删除字符串列表中的重复字符串 该字符串是键的值 对于这个例子 期望
  • Gunicorn 工作人员无论如何都会超时

    我正在尝试通过gunicorn运行一个简单的烧瓶应用程序 但是无论我做什么 我的工作人员都会超时 无论是否有针对应用程序的活动 工作人员在我设置任何内容后总是会超时timeout值到 是什么导致它们超时 当我发出请求时 请求成功通过 但工作
  • 如何在 __init__ 中使用await设置类属性

    我如何定义一个类await在构造函数或类体中 例如我想要的 import asyncio some code class Foo object async def init self settings self settings setti
  • NLTK 2.0分类器批量分类器方法

    当我运行此代码时 它会抛出一个错误 我认为这是由于 NLTK 3 0 中不存在batch classify 方法 我很好奇如何解决旧版本中的某些内容在新版本中消失的此类问题 def accuracy classifier gold resu
  • 使用主题交换运行多个 Celery 任务

    我正在用 Celery 替换一些自制代码 但很难复制当前的行为 我期望的行为如下 创建新用户时 应向tasks与交换user created路由键 该消息应该触发两个 Celery 任务 即send user activate email
  • 为什么 web2py 在启动时崩溃?

    我正在尝试让 web2py 在 Ubuntu 机器上运行 所有文档似乎都表明要在 nix 系统上运行它 您需要下载源代码并执行以下操作 蟒蛇 web2py py 我抓住了source http www web2py com examples
  • MongoEngine 查询具有以列表中指定的前缀开头的属性的对象的列表

    我需要在 Mongo 数据库中查询具有以列表中任何前缀开头的特定属性的元素 现在我有一段这样的代码 query mymodel terms term in query terms 并且这会匹配在列表 term 上有一个项目的对象 该列表中的
  • 使用 python/numpy 重塑数组

    我想重塑以下数组 gt gt gt test array 11 12 13 14 21 22 23 24 31 32 33 34 41 42 43 44 为了得到 gt gt gt test2 array 11 12 21 22 13 14
  • 导入错误:没有名为flask.ext.login的模块

    我的flask login 模块有问题 我已经成功安装了flask login模块 另外 从命令提示符我可以轻松运行此脚本 不会出现错误 Python 2 7 r27 82525 Jul 4 2010 07 43 08 MSC v 1500
  • 未知错误:Chrome 无法启动:异常退出

    当我使用 chromedriver 对 Selenium 运行测试时 出现此错误 selenium common exceptions WebDriverException Message unknown error Chrome fail
  • python的shutil.move()在linux上是原子的吗?

    我想知道python的shutil move在linux上是否是原子的 如果源文件和目标文件位于两个不同的分区上 行为是否不同 或者与它们存在于同一分区上时的行为相同吗 我更关心的是如果源文件和目标文件位于同一分区上 shutil move
  • Django 视图中的“请求”是什么

    在 Django 第一个应用程序的 Django 教程中 我们有 from django http import HttpResponse def index request return HttpResponse Hello world
  • 将 Matlab 的 datenum 格式转换为 Python

    我刚刚开始从 Matlab 迁移到 Python 2 7 在读取 mat 文件时遇到一些问题 时间信息以 Matlab 的日期数字格式存储 对于那些不熟悉它的人 日期序列号将日历日期表示为自固定基准日期以来已经过去的天数 在 MATLAB
  • Protobuf 如何编码 oneof 消息结构

    对于这个 python 程序 在编码时运行 protobuf 编码会给出以下输出 0a 10 08 7f8a 0104 08 02 10 0392 0104 08 02 10 03 18 01 我不明白的是为什么8a后面有一个01 为什么9
  • 每当使用 import cv2 时 OpenCV 都会出错

    我在终端上使用 pip3 install opencv contrib python 安装了 cv2 并且它工作了 但是每当我尝试导入 cv2 或运行导入了 cv2 的 vscode 文件时 在 python IDLE 上它都会说 Trac
  • 如何使用 Boto3 启动具有 IAM 角色的 EC2 实例?

    我无法弄清楚如何使用指定的 IAM 角色在 Boto3 中启动 EC2 实例 以下是迄今为止我如何成功创建实例的一些示例代码 import boto3 ec2 boto3 resource ec2 region name us west 2
  • 如何将 Django 中的权限添加到模型并使用 shell 进行测试

    我在模型中添加了 Meta 类并同步了数据库 然后在 shell 中创建了一个对象 它返回 false 所以我真的无法理解错误在哪里或者缺少什么是否在其他文件中可能存在某种配置 class Employer User Employer in
  • 将索引与值交换的最快方法

    考虑pd Series s s pd Series list abcdefghij list ABCDEFGHIJ s A a B b C c D d E e F f G g H h I i J j dtype object 交换索引和值并
  • JSON:TypeError:Decimal('34.3')不是JSON可序列化的[重复]

    这个问题在这里已经有答案了 我正在运行一个 SQL 查询 它返回一个小数列表 当我尝试将其转换为 JSON 时 出现类型错误 查询 res db execute SELECT CAST SUM r SalesVolume 1000 0 AS

随机推荐

  • 反应变化最小/最大范围+ 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 部分组成 在导入部分之后 我定义了在代码中使用的常量 下一部分是一个字典 我用它以