- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
一位程序员提醒我注意一个问题,matplotlib.pyplot 和 Tkinter 不能很好地协同工作,如这个问题所示 Tkinter/Matplotlib backend conflict causes infinite mainloop
我们更改了代码以防止链接问题中提到的潜在问题,如下所示:
旧
import matplotlib.pyplot as plt
self.fig = plt.figure(figsize=(8,6))
if os.path.isfile('./UI.png'):
image = plt.imread('./UI.png')
plt.axis('off')
plt.tight_layout()
im = plt.imshow(image)
# The Canvas
self.canvas = FigureCanvasTkAgg(self.fig, master = master)
self.toolbar = NavigationToolbar2TkAgg(self.canvas, root)
self.canvas.get_tk_widget().pack(fill=BOTH,expand=YES)
self.canvas.draw()
中级(未显示 UI.png)
import matplotlib.pyplot as plt
import matplotlib
self.fig = matplotlib.figure.Figure(figsize=(8, 6))
if os.path.isfile('./UI.png'):
image = matplotlib.image.imread('./UI.png')
plt.axis('off')
plt.tight_layout()
plt.imshow(image)
# The Canvas
self.canvas = FigureCanvasTkAgg(self.fig, master=master)
self.toolbar = NavigationToolbar2TkAgg(self.canvas, root)
self.canvas.get_tk_widget().pack(fill=BOTH, expand=YES)
self.canvas.draw()
更改后的代码不再显示“背景”图像,我主要只是尝试随机操作(因为我对这两个选项之间的差异感到很迷茫)以再次显示图形。更改涉及从 tight_layout
切换到 set_tight_layout
以避免警告,如 https://github.com/matplotlib/matplotlib/issues/1852 中所述。 .结果代码如下:
潜在修复
import matplotlib.pyplot as plt
import matplotlib
self.fig = matplotlib.figure.Figure(figsize=(8, 6))
background_image = self.fig.add_subplot(111)
if os.path.isfile('./UI.png'):
image = matplotlib.image.imread('./UI.png')
background_image.axis('off')
#self.fig.tight_layout() # This throws a warning and falls back to Agg renderer, 'avoided' by using the line below this one.
self.fig.set_tight_layout(True)
background_image.imshow(image)
# The Canvas
self.canvas = FigureCanvasTkAgg(self.fig, master=master)
self.toolbar = NavigationToolbar2TkAgg(self.canvas, root)
self.canvas.get_tk_widget().pack(fill=BOTH, expand=YES)
self.canvas.draw()
因此问题是,为什么我们现在需要使用子图(使用 matplotlib.figure.Figure)而之前不需要(使用 matplotlib.pyplot)?
PS:如果这是一个愚蠢的问题,我很抱歉,但我能找到的关于该主题的几乎所有内容似乎都使用了 matplotlib.pyplot
变体。因此,我无法为 matplotlib.figure.Figure
变体找到任何好的文档。
最佳答案
The question therefore is, why do we need to use a subplot now (using matplotlib.figure.Figure) while before we did not (using matplotlib.pyplot)?
subplot
创建一个 Axes
对象。您之前确实有一个,但是 pyplot
API 将它“隐藏”在幕后,所以您没有意识到。您现在正在尝试直接使用对象,所以必须自己处理。
您看到此行为的原因是 matplotlib.pyplot
的工作方式。引用the tutorial一点点:
matplotlib.pyplot
is a collection of command style functions that make matplotlib work like MATLAB....matplotlib.pyplot
is stateful, in that it keeps track of the current figure and plotting area, and the plotting functions are directed to the current axes
关键是 pyplot
是有状态的。它“在幕后”跟踪状态并在某种程度上向您隐藏对象模型。它还会做一些隐含的事情。所以 - 如果您只是调用,例如 plt.axis()
,在幕后 pyplot
calls plt.gca()
反过来calls gcf()
这将return a new figure ,因为您还没有通过 pyplot
设置图形。对于大多数 plt.some_function()
调用都是如此 - 如果 pyplot
没有图形对象在它自己的状态 然而,它会创建一个。
因此,在您的中间示例中,您创建了自己的 Figure
对象 - 为其命名 self.fig
(我不确定您的类结构是什么是,所以我不知道 self
是什么,但我猜它是你的 tk.Frame
对象或类似的东西)。
pyplot
对 self.fig
一无所知。因此,在您的中间代码中,您在 pyplot
状态的 Figure
对象上调用 imshow()
,但显示不同的图形(self.fig
) 在你的 Canvas 上。
问题不在于您需要这样使用 subplot
,而是您需要更改正确的 Figure
对象上的背景图像。您在潜在的修复代码中使用 subplot
的方式可以做到这一点 - 尽管我在下面建议了一个替代方案,它可能会使意图更清晰。
改变
plt.axis('off')
plt.tight_layout()
plt.imshow(image)
到
self.fig.set_tight_layout(True)
ax = self.fig.gca() # You could use subplot here to get an Axes object instead
ax.axis('off')
ax.imshow(image)
pyplot
API 与直接使用对象这有点意见,但可能会有所帮助。当我需要快速制作原型(prototype)并希望使用其中一个相当标准的案例时,我倾向于使用 pyplot
界面。通常,这就足够了。
一旦我需要做更复杂的事情,我就开始直接使用对象模型——维护我自己命名的 Figure
和 Axes
对象等。
将两者混合使用是可能的,但通常会造成混淆。您已经通过中间解决方案找到了这一点。所以我建议做一个或另一个。
关于python - 为什么 matplotlib.figure.Figure 的行为与 matplotlib.pyplot.figure 如此不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31611188/
我有 table 像这样 -------------------------------------------- id size title priority
我的应用在不同的 Activity (4 个 Activity )中仅包含横幅广告。所以我的疑问是, 我可以对所有横幅广告使用一个广告单元 ID 吗? 或者 每个 Activity 使用不同的广告单元
我有任意(但统一)数字列表的任意列表。 (它们是 n 空间中 bin 的边界坐标,我想绘制其角,但这并不重要。)我想生成所有可能组合的列表。所以:[[1,2], [3,4],[5,6]] 产生 [[1
我刚刚在学校开始学习 Java,正在尝试自定义控件和图形。我目前正在研究图案锁,一开始一切都很好,但突然间它绘制不正确。我确实更改了一些代码,但是当我看到错误时,我立即将其更改回来(撤消,ftw),但
在获取 Distinct 的 Count 时,我在使用 Group By With Rollup 时遇到了一个小问题。 问题是 Rollup 摘要只是所有分组中 Distinct 值的总数,而不是所有
这不起作用: select count(distinct colA, colB) from mytable 我知道我可以通过双选来简单地解决这个问题。 select count(*) from (
这个问题在这里已经有了答案: JavaScript regex whitespace characters (5 个回答) 2年前关闭。 你能解释一下为什么我会得到 false比较 text ===
这个问题已经有答案了: 奥 git _a (56 个回答) 已关闭 9 年前。 我被要求用 Javascript 编写一个函数 sortByFoo 来正确响应此测试: // Does not cras
所以,我不得不说,SQL 是迄今为止我作为开发人员最薄弱的一面。也许我想要完成的事情很简单。我有这样的东西(这不是真正的模型,但为了使其易于理解而不浪费太多时间解释它,我想出了一个完全模仿我必须使用的
这个问题在这里已经有了答案: How does the "this" keyword work? (22 个回答) 3年前关闭。 简而言之:为什么在使用 Objects 时,直接调用的函数和通过引用传
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicate: what is the difference between (.) dot operator and (-
我真的不明白这里发生了什么但是: 当我这样做时: colorIndex += len - stopPos; for(int m = 0; m < len - stopPos; m++) { c
思考 MySQL 中的 Group By 函数的最佳方式是什么? 我正在编写一个 MySQL 查询,通过 ODBC 连接在 Excel 的数据透视表中提取数据,以便用户可以轻松访问数据。 例如,我有:
我想要的SQL是这样的: SELECT week_no, type, SELECT count(distinct user_id) FROM group WHERE pts > 0 FROM bas
商店表: +--+-------+--------+ |id|name |date | +--+-------+--------+ |1 |x |Ma
对于 chrome 和 ff,当涉及到可怕的 ie 时,这个脚本工作完美。有问题 function getY(oElement) { var curtop = 0; if (oElem
我现在无法提供代码,因为我目前正在脑海中研究这个想法并在互联网上四处乱逛。 我了解了进程间通信和使用共享内存在进程之间共享数据(特别是结构)。 但是,在对保存在不同 .c 文件中的程序使用 fork(
我想在用户集合中使用不同的功能。在 mongo shell 中,我可以像下面这样使用: db.users.distinct("name"); 其中名称是用于区分的集合字段。 同样我想要,在 C
List nastava_izvjestaj = new List(); var data_context = new DataEvidencijaDataContext();
我的 Rails 应用程序中有 Ransack 搜索和 Foundation,本地 css 渲染正常,而生产中的同一个应用程序有一个怪癖: 应用程序中的其他内容完全相同。 我在 Chrome 和 Sa
我是一名优秀的程序员,十分优秀!