- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
首先,对于这篇冗长的文字表示歉意。我是 python 和 matplotlib 的新手,所以请耐心等待。
作为 question 的后续行动我发现在 Raspberry Pi 上使用 web2py 生成网格的方法非常耗时。我有一个 csv 文件,大约有 12k 行,如下所示:
1;1.0679759979248047;0.0;147.0;0.0;;{'FHR1': 'US', 'FHR2': 'INOP', 'MHR': 'INOP'};69;good;;;;1455891539.502167
问题是,使用 numpy.genfromtxt 读取这 12k 行已经花费了 30 秒左右的时间。然后填充图表(没有精美的网格)又花了 30 秒,仅使用该 csv 的第 1、3 和 7 列。但添加解决方案后,时间猛增至 170 秒。所以现在我必须弄清楚如何将时间消耗减少到一分钟以下。
我的第一个想法是消除 csv - 无论如何我都是读取数据的人,所以我可以通过将数据保留在内存中或立即将其写入绘图来跳过它。这就是我所做的,(在我看来)简单的测试布局并使用 pdf 后端。我选择每次获取数据时将数据写入图表,并在传输完成后保存图表。我以为这应该可以正常工作,但事实并非如此。我不断收到可笑的错误:
RuntimeError: RRuleLocator estimated to generate 9178327 ticks from 0001-01-01 15:20:31.883239+00:00 to 0001-04-17 20:52:39.779205+00:00: exceeds Locator.MAXTICKS * 2 (6000000)
相信我,每次测试运行时我都会不断增加这些 maxticks,以达到错误消息所示的数字。这很荒谬,因为该消息仅包含 60 秒的数据,而我想要访问接近 24 小时的数据。我要么希望 RRuleLocator 停止估计,要么只是闭嘴等待数据结束。我真的不认为我可以从中制作出 MCVE,但我可以找出我最有可能搞砸的细节。
首先,我设置了一些类,所以没有全局变量。为了简化,我有一个通信类,它以一秒的间隔读取串行端口。运行良好,直到昨天将串行端口上输入的所有内容写入 csv 中。现在我想看看是否可以在获取数据的同时填充图表,并在完成后保存它。因此,为了进行测试,我将其添加到我的 .py
import matplotlib
matplotlib.use('PDF') # I want a PDF in the end
from matplotlib import dates
import matplotlib.pyplot as plt
import numpy as np
from numpy import genfromtxt
然后是通信类的一些成员,来自图表部分,主要是上面提到的解决方案。我在类 init
中初始化它们 self.fig = None
self.ctg = None
self.toco = None
然后,一旦我感觉收到的数据处于正确的形式/状态,我就会调用这个方法,以便图表可以准备好填充数据
def prepchart(self):
# how often to show xticklabels and repeat yticklabels:
print('prepchart')
xtickinterval = 5
hfmt = dates.DateFormatter('%H:%M:%S')
self.fig = plt.figure()
self.ctg = self.fig.add_subplot(2, 1, 1) # two rows, one column, first plot
plt.ylim(50, 210)
self.toco = self.fig.add_subplot(2, 1, 2)
plt.ylim(0, 100)
# Set the minor ticks to every 30 seconds
minloc = dates.SecondLocator(bysecond=[0,30])
minloc.MAXTICKS = 3000000
self.ctg.xaxis.set_minor_locator(minloc)
# self.ctg.xaxis.set_minor_locator(dates.MinuteLocator())
self.ctg.xaxis.set_major_formatter(hfmt)
self.toco.xaxis.set_minor_locator(dates.MinuteLocator())
self.toco.xaxis.set_major_formatter(hfmt)
# actg.xaxis.set_ticks(rotation=45)
plt.xticks(rotation=45)
然后,一旦我有了想要绘制的数据,我就会在我的数据处理方法中执行此操作
self.ctg.plot_date(timevalue, heartrate, '-')
self.toco.plot_date(timevalue, toco, '-')
最后,一旦不再发送数据(可能是一分钟或 24 小时后),我就会打电话
def handleCTG(self):
self.fig.savefig('/home/pi/test.pdf')
结论:我的做法是完全错误的还是我的代码中有错误?这真的是减少图表生成等待时间的一种方法吗?
最佳答案
好的,事情就这样了。显然,web2py 的运行非常严格。这意味着没有那么多线程 float ,并且它肯定不会为我的小图表创建启动新线程。当我在 Raspis 任务管理器上跟踪 CPU 使用情况时,我注意到了这一点,但只看到了 25% 左右的情况。现在 Raspberry Pi 有 4 个内核...去算一下吧。首先,我在 Raspi 上的 web2py 之外运行我的脚本,你瞧,包括 csv 读取和图表渲染在内的整个过程只需要 20 秒。从那时起(受到 How to run a task outside web2py and retrieve the output 的启发),这就是小菜一碟:使用记录良好的子进程通过此脚本调用新的 python 并完成。因此,感谢任何对此进行思考的人。
关于python - 需要帮助解决 Raspberry Pi 上 matplotlib 的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35629471/
我无法在此图中定位轴标签。我喜欢放置顶部标签,使管道与网格对齐,并放置左右标签,以便它们不接触绘图。 我试过了 ax.tick_params(axis='both', which='both'
我使用的是 python 2,下面的代码只是使用了一些示例数据,我的实际数据可能有不同的长度,并且可能不是很细。 import numpy as np import datetime i
给定坐标 [1,5,7,3,5,10,3,6,8]为 matplotlib.pyplot ,如何突出显示或着色线条的不同部分。例如,列表中的坐标 1-3 ( [1,5,7,3] ) 表示属性 a .我
我正在matplotlib中绘制以下图像。 我的问题是,图像看起来像这样,但是,我想使背景变暗,因为当我打印该图像时,灰度部分不会出现在打印物中。有人可以告诉我API进行此更改吗? 我使用简单的API
这是关于matplotlib的一个非常基本的问题,但是我不知道该怎么做: 我想绘制多个图形,并使用绘制窗口中的箭头从一个移到另一个。 目前,我只知道如何创建多个图并将其绘制在不同的窗口中,如下所示:
在 matplotlib 中绘制小块对象时,由于显示分辨率而引入了伪影。使用抗锯齿并不能解决问题。 这个问题有解决方案吗? import matplotlib.pyplot as plt impo
对于直方图,有一个简单的内置选项 histtype='step' .如何制作相同风格的条形图? 最佳答案 [阅读评论后添加答案] 将可选关键字设置为 fill=False对于条形图: import m
我正在尝试在 (6X3) 网格上创建子图。我对图例的位置有疑问。图例对所有子图都是通用的。 lgend 现在与 y 轴标签重叠 我尝试删除 constrained_layout=True 选项。但这在
我有一个带有一些线段( LineCollection )和一些点的图表。这些线和点有一些与它们相关的值,但没有绘制出来。我希望能够添加鼠标悬停工具提示或其他方法来轻松找到点和线的关联值。这对于点或线段
我想创建一个带有对齐不同曲线文本的图例的图。这是一个最小的工作示例: import matplotlib.pyplot as plt import numpy as np x=np.linspace(
可以说我正在用matplotlib绘制一条线并添加一个图例。 在图例中,其显示为------ Label。当绘制较小的图形尺寸以进行打印时,我发现该行的默认水平长度太长。 是否存在将------ La
我正在使用 matplotlib 构建一个 3D 散点图,但无法使生成的图形具有所有 3 个轴的共同原点。我怎样才能做到这一点? 我的代码(到目前为止),我还没有为轴规范实现任何定义,因为我对 Pyt
我有一个我想使用的绘图布局,其中 9 个不同的数据簇被布置在一个方形网格上。网格中的每个框都包含 3 个并排布置的箱线图。 我最初的想法是这将适合 3x3 子图布局,每个单独的子图本身被划分为 3x1
我的图形从y=-1变为y=10 我想在任意位置写一小段文字,例如x=2000,y=5: ax.annotate('MgII', xy=(2000.0, 5.0), xycoords='data')
我想使用LateX格式来构建一个表达式,其中出现一些数字,但这些数字是用LateX表达式中的变量表示的。 实际的目标是在axes.annotate()方法中使用它,但是为了讨论起见,这里是一个原理代码
我需要比较两组的二维分布。 当我使用 matplotlib.pyplot.contourf并覆盖图,每个等高线图的背景颜色填充整个图空间。有没有办法让每个等高线图的最低等高线级别透明,以便更容易看到每
在R中,有一个locator函数,类似于Matlab的ginput,您可以用鼠标单击图形并选择任何x,y坐标。此外,还有一个名为identify(x,y)的函数,如果您给它绘制了一组绘制的点x,y,然
我想用matplotlib生成矢量图。我尽力了-但输出是光栅图像。这是我使用的: import matplotlib matplotlib.use('Agg') import matplotlib.p
我正在尝试使用 matplotlib 制作具有非常小的灰点的散点图。由于点密度的原因,点需要很小。问题是 scatter() 函数的标记似乎既有线条又有填充。当标记很小时,只有线条可见,而看不到填充,
我不太明白为什么我无法在指定的限制内创建水平和垂直线。我想用这个框绑定(bind)数据。然而,双方似乎并没有遵守我的指示。为什么是这样? # CREATING A BOUNDING BOX # BOT
我是一名优秀的程序员,十分优秀!