【问题标题】:Using plt functions on figures in matplotlib or passing plt to mpld3在 matplotlib 中的图形上使用 plt 函数或将 plt 传递给 mpld3
【发布时间】:2017-03-02 20:52:22
【问题描述】:

许多示例使用fig, ax = plt.subplots() 定义figax,然后它们直接调用图形对象上的函数。相反,其他示例直接使用 plt. This answer 解释了一些差异,但我仍然不清楚两件事。首先,如果我不创建单独的图形对象,我如何将它传递给另一个函数。例如,当我创建一个图形对象时,我可以将它传递给mpld3 以创建 D3 可视化:

d3plot = mpld3.fig_to_html(fig,template_type="simple")

其次,如果我确实创建了图形对象,那么如何调用可以在图形上的 plt 上调用的函数?例如,我希望能够运行以下代码,然后将其作为图形传递给 mpld3,如上所述。

plt.imshow(wordcloud)
plt.axis("off")
plt.show()

另一个答案说 plt.subplots() 解包一个元组。我不确定它是否会解开 plt 上已有的内容。所以我尝试了:

wordcloud = WordCloud().generate(text)
plt.imshow(wordcloud)
plt.axis("off")
fig, ax = plt.subplots()
d3plot = mpld3.fig_to_html(fig,template_type="simple")

然而,这只是给了我一个黑色的情节,这与我之前的理解一致,即plt.subplots() 创造了全新的数字。

更新 基于 cmets,我尝试了以下方法:

wordcloud = WordCloud().generate(text)
figTopicWordCloud, ax = plt.subplots()
ax.imshow(wordcloud)
ax.axis('off')
d3plot = mpld3.fig_to_html(figTopicWordCloud, template_type="simple")

虽然这成功生成了绘图,但它并没有从图中删除轴。

【问题讨论】:

  • 我建议始终使用轴对象。创建图形后,通过调用 ax=plt.gca() 或 - 对于特定图形对象 - 通过调用 ax=fig.gca() 获取当前轴。如果您的布局包含子图,您可以通过调用 ax=fig.add_subplot(111) 来获取子图轴对象。轴对象的方法与 plt 函数的调用方式不同,请查看此文档:matplotlib.org/api/axes_api.html
  • 我不遵循,你建议的顺序我在上面的例子中采用。我也无法将坐标轴传递给 mpld3.fig_to_html,所以我不确定你在做什么区分或它如何解决当前的情况。
  • 对不起,我误解了你问题的一部分。您正在寻找的是fig=plt.gcf()。详情见我的回答。
  • 请参阅 Andreas Mueller 的 matplotlib 解释视频,它可能会有所帮助。 youtube.com/…

标签: python matplotlib word-cloud mpld3


【解决方案1】:

当你运行类似的东西时

plt.imshow()

matplotlib 之前没有明确创建图形,而是创建了一个新的图形对象和一个新的轴对象。要访问该图,请使用

fig = plt.gcf()

这将返回当前图形。同样,

ax = fig.gca()

为您提供对该图中当前活动轴的引用。调用

fig, ax = plt.subplots()

但是,是以下内容的缩写:

fig = plt.figure()
ax = fig.add_subplot(111)

第一行将创建一个全新的图形对象。

为您的案例提供一种快速解决方案,它可以绘制数据并在此之后访问隐式创建的图形,如下所示:

plt.imshow(wordcloud)
plt.axis("off")
fig = plt.gcf()
d3plot = mpld3.fig_to_html(fig, template_type="simple")

您也可以在实际绘图之前显式创建图形。你的例子会变成

fig = plt.figure()
ax = fig.gca()
ax.imshow(wordcloud)
ax.set_axis_off()
d3plot = mpld3.fig_to_html(fig, template_type="simple")

我通常会推荐此解决方案,因为您始终可以确定您正在绘制正确的数字。这在一次处理多个图形时特别有用。

【讨论】:

  • 你的第一个方法确实搞砸了其他情节。第二种方法没有,但生成的图形仍然有轴。
  • 我更新了答案的最后一部分。此代码应生成一个没有可见轴的图形。
  • 添加 ax.set_axis_off() 仍然不会抑制轴。我想我可能还必须添加fig.add_axes(ax),所以我做了,但也没有用。
  • 这很奇怪。我在答案中发布的解决方案对我来说非常好。你用的是什么版本的 Python 和 matplotlib?
  • Python 2.7.6。和 matplotlib 1.4.3。我可能会在不破坏任何东西的情况下更新 matplotlib。我刚刚尝试过,在 2.0.0 版本中这仍然不起作用。当你说它对你有用时,我假设你正在采取最后一步查看在浏览器中呈现的 d3 图,而不是只看图?感谢您的所有帮助。
猜你喜欢
  • 2019-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-13
相关资源
最近更新 更多