- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
一个web搜索会发现几个简单的(没有文档记录的)例子(并且很好地answers here关于)如何使用flask动态地为matplotlib图形提供服务;但是它们的一些特性以及它们之间的差异让我困惑。
Some使用低级IO并返回元组
io = StringIO.StringIO()
plt.savefig(io, format='png')
io.seek(0)
data = io.read()
return data, 200, {'Content-type': 'image/png'}
Response
io = StringIO.StringIO()
canvas = FigureCanvas(fig)
canvas.print_png(io)
response = make_response(io.getvalue())
response.mimetype = 'image/png' # or response.headers['Content-Type'] = 'image/png'
return response
io = StringIO.StringIO()
fig.savefig(io, format='png')
data = io.getvalue().encode('base64')
return html.format(data)
StringIO
扮演的角色是什么;这是为(任何类型的)形象服务的唯一方法吗?
seek
plus
read
和
getvalue
有什么意义吗,或者做这些基本上是一样的事情;
html.format
(with
Response
);最后
make_response
,而另一些方法则设置编码(base64)?
最佳答案
斯金吉奥扮演的角色是什么?这是准备
为(任何类型的)形象服务?
首先,不,这不是唯一的办法“经典的”方法是使用文件系统:
让matplotlib创建绘图。
持久地将相应的图像数据保存到文件系统中的一个文件中(这涉及到上下文切换到调用系统调用的内核,如write()
)。
再次读取此文件的内容(这使内核可以通过read()
为您读取文件系统)。
在具有定义良好的数据编码和正确设置头的http响应中,向客户端提供内容。
步骤(3)和(4)涉及文件系统交互也就是说,内核实际上与硬件组件进行对话。这需要时间(对于传统的hrad驱动器,仅向磁盘写入几个字节可能需要几毫秒,因为访问时间很长)。现在,问题是:您需要将图像数据持久化到磁盘吗?如果答案是“否”,那么您可以跳过与文件系统的整个交互,将图像数据保存在web应用程序进程的内存中,从而节省一些时间。这就是StringIO
的好处:StringIO
是python中一个非常通用的工具,它提供类似文件的对象,而实际的数据从来没有委托给内核将其写入文件系统或从文件系统读取。它被保存在记忆中这就是为什么StringIO对象也被称为内存文件的原因。
关键是plt.savefig()
希望有一个对象作为第一个参数,它看起来像一个实际代表文件系统中真实文件的对象StringIO
提供了这样一个对象,但是——在幕后——将数据写入当前进程堆中的缓冲区,并在请求时从那里再次读取数据。
通过StringIO
读取/写入小部分数据需要纳秒或微秒,而与文件系统的交互通常要慢几个数量级。
现在,请不要误会:通常,文件系统足够快,而且操作系统有自己的技术,可以使文件系统交互尽可能快。真正的问题是,如前所述:是否需要持久化图像数据?如果您不想在以后的某个时候访问此图像数据,则不要涉及文件系统。这是你展示的三个片段的创造者决定的。
出于性能原因,用StringIO替换真正的文件系统交互可能是一个非常有效的决定然而,在您的web应用程序中肯定还有其他瓶颈例如,使用StringIO可以减少请求-响应延迟5毫秒,但考虑到100毫秒的网络延迟,这是否真的很重要另外,请记住,一个严肃的web应用程序最好不要为发送大文件内容而烦恼——这些文件内容最好由一个建立良好的web服务器提供,该服务器还可以使用sendfile()
系统调用在这种情况下,让matplotlib将文件写入文件系统,然后告诉您的web服务器(通过X-Sendfile
头)执行其余操作可能会更好。所以,性能是一个复杂的话题可能不是最有力的论据。但只有你知道你的要求!
使用seek plus read和getvalue有什么意义吗?
或者它们做了本质上相同的事情
本质上是一样的不会产生概念上的差异,也不会产生(显著的)性能差异。
决定返回内容的方法选择的是什么:元组
对html.format对a response(带有make_response);最后
没有明确的答案向客户机获取数据的方法有很多。没有“正确”的方法,只是好坏。哪种方法最好,这在很大程度上取决于web框架。对于Flask,make_response()
是创建响应对象的标准方法html.format()
可能有一些我不知道的优点——你需要自己读一下!但是,继续读下去,我认为有一种方法内置在烧瓶里,非常适合你的场景。
为什么有些方法显式地设置内容类型,而另一些方法
是否将编码设置为“base64”?
通过http向浏览器发送文件有正确和不正确的方法。通常,http响应应该包含某些头(另请参见What HTTP response headers are required)。为了你的理解,你可能想看看这些细节。当然,二进制数据需要用客户机能够理解的编码进行编码,并且必须在响应头中澄清编码此外,正确的HTTP响应应该包含MIME类型(内容类型)你所提出的方法似乎并不能真正控制其中的一个或另一个(没有冒犯,快速和肮脏的例子往往更多地关注一件事而不是另一件事)。
我认为你真的应该用烧瓶法来处理一些重要的事情这个方法有几个参数我将通过mimetype
显式定义mime类型。第一个参数可以是类似文件的对象,因此stringio对象可以正常工作。但是,在这种情况下,您需要在执行以下操作之前执行seek(0)
:
确保文件指针位于
在调用send_file()之前发送。
以下两种方法在语义上很优雅(在我看来),应该适当地注意对文件内容进行编码和设置http响应头:
from flask import send_file
f = StringIO.StringIO()
plt.savefig(f, format='png', dpi=300)
f.seek(0)
send_file(f, mimetype='image/png')
plt.savefig('image.png', dpi=300)
send_file('image.png', mimetype='image/png')
关于python - 使用Flask提供Matplotlib图像的成语之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28091129/
我无法在此图中定位轴标签。我喜欢放置顶部标签,使管道与网格对齐,并放置左右标签,以便它们不接触绘图。 我试过了 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
我是一名优秀的程序员,十分优秀!