matplotlib:figimage 未显示在 Jupyter 笔记本中

Posted

技术标签:

【中文标题】matplotlib:figimage 未显示在 Jupyter 笔记本中【英文标题】:matplotlib: figimage not showing in Jupyter notebook 【发布时间】:2018-02-26 22:32:35 【问题描述】:

我正在尝试以真实尺寸(未缩放或拉伸)渲染图像,使用 matplotlib 执行此操作的最简单方法似乎是 figimage

但是,当我尝试在 Jupyter 笔记本中使用它时,该图不显示。其他情节显示正常,这似乎只影响figimage

如您所见,第一个情节显示良好,但第二个情节却没有。我做错了什么?

当我在 IPython shell 中运行以下代码时,该图按预期显示,所以可能是我的 Jupyter 设置有问题?

import matplotlib
from matplotlib import pyplot as plt
import numpy as np

x = np.linspace(0, 2*np.pi, 500)
plt.plot(x, np.sin(x))
plt.show()

data = np.random.random((500,500))
plt.figimage(data)
plt.show()

【问题讨论】:

【参考方案1】:

figimage 只为当前图形添加背景。如果您没有已经存在的图形,则该命令不会渲染任何内容。以下 sn-p 将在 IPython Notebook 内部和外部工作:

%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
import numpy as np

plt.figure()

x = np.linspace(0, 2 * np.pi, 500)
plt.plot(x, np.sin(x))

data = np.random.randn(500, 500)
plt.figimage(data)

plt.show()

但是,它并没有达到您想要/期望的效果。为了以真实尺寸渲染图像,您必须使用figsizedpi,就像其他人之前尝试过的[1] [2] [3] [4]:

data = np.random.randn(500, 500)
dpi = 80
shape = data.shape

fig, ax = plt.subplots(figsize=(shape[1]/float(dpi), shape[0]/float(dpi)), dpi=dpi, frameon=False)
ax.imshow(data, extent=(0,1,1,0))
ax.set_xticks([])  # remove xticks
ax.set_yticks([])  # remove yticks
ax.axis('off')     # hide axis
fig.subplots_adjust(bottom=0, top=1, left=0, right=1, wspace=0, hspace=0)  # streches the image and removes margins
fig.savefig('/tmp/random.png', dpi=dpi, pad_inches=0, transparent=True) # Optional: save figure
fig.show()

【讨论】:

哦,我明白了。 figimage 主要用于渲染背景?你的建议很有魅力(虽然我不完全理解对子图的需求),谢谢! @nfelger 没错,简短的回答是figimage 仅用于背景。至于子图,不是完全必要的,您可以用plt.xticks([]) 替换所有这些命令(其他命令也类似),但我喜欢用figaxes 编码,因为我认为它使代码更清晰,尤其是当您有多个子图时。如果您将第一个命令替换为 plt.figure(.......),它的作用完全相同。

以上是关于matplotlib:figimage 未显示在 Jupyter 笔记本中的主要内容,如果未能解决你的问题,请参考以下文章

Matplotlib 图未显示

matplotlib轴未显示完整值[重复]

Matplotlib 绘图未在 sublimetext 中显示

Matplotlib 保存为 pdf 在条形图中未显示影线标记 - 潜在错误?

matplotlib 3d曲面图未显示[重复]

Matplotlib NavigationToolbar小部件未显示在Tkinter GUI中