【问题标题】:Display seaborn plots at some point later in code稍后在代码中显示 seaborn 图
【发布时间】:2020-06-01 07:26:56
【问题描述】:

假设在我的代码中,我有以下两个图表:即 graph_p_changes 和 graph_p_contrib

line_grapgh_p_changes = df_p_change[['year','interest accrued', 'trade debts', 'other financial assets']].melt('year', var_name='variables',  value_name='p_changes')
graph_p_changes = sns.factorplot(x="year", y="p_changes", hue='variables', data=line_grapgh_p_changes, height=5, aspect=2)
graph_p_changes.set(xlabel='year', ylabel='percentage change in self value across the years')

line_grapgh_p_contrib = df_p_contrib[['year','interest accrued', 'trade debts', 'other financial assets']].melt('year', var_name='variables',  value_name='p_changes')
graph_p_contrib = sns.factorplot(x="year", y="p_changes", hue='variables', data=line_grapgh_p_contrib, height=5, aspect=2)
graph_p_contrib.set(xlabel='year', ylabel='percentage chnage in contribution to total value')

现在在我的代码稍后的某个时间点,我只想显示上述两个图表之一。但是当我执行 plt.show() 时,它会在我的 jupyter 笔记本中显示上述两个图表。如何在我的代码中的任何时候只显示一个图表。

【问题讨论】:

    标签: python-3.x matplotlib plot data-visualization seaborn


    【解决方案1】:

    您需要为每个绘图引用分配的变量,然后在之后添加 .fig 以在 Jupyter 笔记本单元格中重新显示它。

    具体来说,在您的情况下,您将在单元格中引用 graph_p_changes.figgraph_p_contrib.fig 并执行该单元格以再次查看单个图。

    这类似于您如何再次显示 Seaborn 的 ClusterGrids,请参阅 here。因为您的问题的标题是“seaborn plots”,为了完整起见,我将添加,这不适用于 Seaborn 的线图 (lineplot) 或条形图 (barplot) 等产生 @987654336 的图@对象。在那里,您使用.figure,例如ax.figure 来回忆Seaborn's lineplot documentation 中列出的大部分示例。


    带有代码的示例猫图

    这是使用来自hereseaborn's catplot documentation(见下文)的示例代码来制作两个图。如果此代码在一个单元格中,然后运行该单元格,您会在其下方的输出中看到两个图。

    import matplotlib.pyplot as plt
    import seaborn as sns
    %matplotlib inline
    
    titanic = sns.load_dataset("titanic")
    exercise = sns.load_dataset("exercise")
    g = sns.catplot("alive", col="deck", 
                    col_wrap=3, data=titanic[titanic.deck.notnull()], 
                    kind="count", height=2.5, aspect=.8)
    
    another_plot = sns.catplot(x="time", y="pulse", hue="kind", data=exercise)
    

    稍后,每个都可以再次单独显示为具有g.figanother_plot.fig 的其他单元格的输出,具体取决于您要显示的图。


    此外,我建议提高您的长期代码可行性,您可能希望继续在绘图调用中使用catplot,因为这就是现在在 seaborn 中调用的 factorplot。请参阅here,其中说“factorplot 仍然存在,并将通过警告将其参数传递给 catplot()。它最终可能会被删除,但过渡将尽可能渐进。”

    更新:

    OP 评论说,所需要的是允许散布 stdout/stderr 输出的代码,并在该流中的精确点处绘制图,而不仅仅是在结尾处。

    由于某种原因,Seaborn 图(甚至是简单的线图)似乎没有被 io.capture_output() 正确“捕获”,所以我不得不在生产单元中使用 %%capture 单元魔法命令并结合在单独的单元格中输出。但是,我基于example code 尝试的绘图被io.capture_output() 捕获,并允许在同一个单元格中轻松混合。这一切都在here 可用的示例笔记本中进行了说明;最好以静态形式 here 查看它,因为 Github 不会呈现 Plotly 图,而 nbviewer 会呈现。该笔记本的顶部包含一个链接,您可以在其中启动将运行的活动 Jupyter 会话。

    【讨论】:

    • 我想我明白了你的意思,而且还有很多路要走,这取决于你真正想要完成的事情。但首先,听起来您显然不想使用plt.show()?你没有测试过吗?您会在 Seaborn 文档中注意到他们不使用它。现代 Jupyter notebook 不需要它。删除它并在您希望它们显示时调用它们。我怀疑尽管您看到了这些图,但它们位于输出的末尾,对吗?这些第一个和第二个 100 行代码块每个都会产生一些输出,您需要在它们之间穿插这些图吗?
    • 希望您能根据我上面的问题进一步澄清。但仅根据您上次写的内容,我质疑的一个方面是您为什么要按照您描述的方式做事?听起来您正在尝试在单个笔记本单元格中运行中等大小的脚本并控制输出的流动方式。虽然这当然可以实现,但最直接的途径是简单地使用笔记本的结构来控制输出的流动方式。使您的代码在多个单元格或函数中,并在您想查看它时调用该图。这可能需要它在自己的单元格中。
    • 您应该能够使用“捕获”来防止在没有plt.show() 的情况下在输出末尾看到的输出,然后在需要时甚至从一个单元格中显示它。在我解释之前,我想确保我完全理解你想要做什么,因为它比仅仅拆分成多个单元更先进。我会更新我的答案来说明这一点。
    • 好吧,Seaborn 不能很好地配合我通常用来在单个单元格中捕获和控制输出的捕获方法。它适用于 Plotly 绘图,但使用 Seaborn 我需要两个单元格。我张贴了说明这个here的笔记本。
    • 我更新的内容最好以静态形式 here 查看。它显示了 gist 站点没有显示的所有图。
    猜你喜欢
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 2017-12-11
    • 1970-01-01
    • 2019-01-04
    • 2022-08-06
    相关资源
    最近更新 更多