Google Colab中的交互式matplotlib图形

59
通常在jupyter笔记本中,我会使用%matplotlib notebook魔法命令来显示交互式窗口,但是在Google Colab中似乎无法使用。是否有解决方案,或者在Google Colab中无法显示交互式窗口?

3
我发现了这个问题(https://github.com/googlecolab/colabtools/issues/86)。如果你看一下这个问题的最后一个评论,你会发现唯一支持的matplotlib后端是“inline”。原因是需要x-forwarding。 - Vemulo
1
这很有道理,感谢提供链接。对于大多数需要绘图的目的,我一直在使用mybinder.org而不是google colab。 - skoeb
7个回答

14
下面是在Google Colab笔记本上使用Plotly和cufflinks创建交互式iplot()的示例。使用了来自答案[1]的函数和建议,以及链接[2]。
关键似乎是在进行绘图的单元格中包含configure_plotly_browser_state()。
下面的代码应该可以工作:
导入库
import datetime
from datetime import date
import pandas as pd
import numpy as np
from plotly import __version__
%matplotlib inline

import plotly.offline as pyo
import plotly.graph_objs as go
from plotly.offline import iplot

import cufflinks as cf
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot 


cf.go_offline()

将笔记本设置为false

init_notebook_mode(connected=False)

为Colab创建函数 从: [1, 2]

def configure_plotly_browser_state():
  import IPython
  display(IPython.core.display.HTML('''
        <script src="/static/components/requirejs/require.js"></script>
        <script>
          requirejs.config({
            paths: {
              base: '/static/base',
              plotly: 'https://cdn.plot.ly/plotly-latest.min.js?noext',
            },
          });
        </script>
        '''))

注意:使用plotly:'https://cdn.plot.ly/plotly-latest.min.js?noext'可以确保使用最新版本的Plotly。也可以通过使用plotly:'https://cdn.plot.ly/plotly-1.5.1.min.js?noext'来指定plotly的版本。 创建示例数据框 数据来源:来自国家气象局的Peachtree City, GA的年降雨量数据[3]
df = pd.DataFrame({
    'month': ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
    'Year_2018': [3.26, 6.11, 4.86, 6.53, 4.45, 3.86, 8.04, 7.59, 1.48, 4.75, 7.27, 11.83],
    'Year_1996': [8.26, 3.82, 6.42, 2.91, 2.12, 1.70, 2.14, 4.66, 4.32, 0.89, 3.22, 4.14]
}
)
df

创建一个交互式iplot
configure_plotly_browser_state()
df.iplot(kind='line',x='month',y=['Year_2018', 'Year_1996'], color=['white', 'gold'], 
theme='solar', mode='markers+lines',title='Annual Rainfall in the city Peachtree City, GA')

输出: 输出

你知道为什么合适的标题没有显示出来,而是显示了“[Object Object]”吗? - P A N
为了方便您,以下是与编程相关的内容的翻译。请将其复制到https://colab.research.google.com/drive/1tXS-kwZUWgkJqYXKxglg67yGQmenSl8d中。 - am70
2
我很失望不得不使用plotly而不是matplotlib,但这更或多少实现了所需的功能,所以我会接受! - skoeb
matplotlib 也可以在 Jupyter 笔记本中使用,但它不是交互式的,而 plotly 是。 - Arthur

9
面对相同的问题(经过大量阅读),我无法让%matplotlib ipympl/widget魔术命令在Colab中工作。然而,下一个最好的解决方案确实是使用Plotly,正如@Nilesh Ingle在他详细的回复中所概述的那样。
然而,在Colab中启用Plotly有一种更简单的方法。
请参阅此共享的 Colab 笔记本以获取最小示例。
以下是快速参考的 Python 代码:
!pip install plotly

import plotly.express as px

SHEET_ID = '153pKW5IZRHwx9mLu_uU-hDSK0D3R19vR71EcgMYHn3I'

df = pd.read_csv('https://docs.google.com/spreadsheets/d/' + SHEET_ID + '/export?format=csv')

fig = px.scatter(data_frame=df, x="x", y="y", width=1000, height=800)
fig.show()

6

这似乎是后端问题。在jupyter笔记本中,列出不同类型的后端的命令是:

%matplotlib --list

输出:

Available matplotlib backends: ['tk', 'gtk', 'gtk3', 'wx', 'qt4', 'qt5', 'qt', 'osx', 'nbagg', 'notebook', 'agg', 'svg', 'pdf', 'ps', 'inline', 'ipympl', 'widget']

然而,对于我的系统/设置,只有“notebook”和另外一个可用。在JupyterLab中,对我来说,没有后端适用于交互式图表(即使是他们推荐的“inline”模式也不行)。

希望这能减少我经历的安装/重新安装的搜索和排列的时间 :))


1

这里有一个获取交互式matplotlib图形的解决方案:

需要单独启用第三方小部件(ipywidgets包之外的小部件)的支持。这些小部件的支持将从Colab外部的CDN加载。

from google.colab import output
output.enable_custom_widget_manager()

第三方小部件的支持将在会话期间保持活动状态。要禁用支持:

from google.colab import output
output.disable_custom_widget_manager()

这是一个例子:

from google.colab import output
output.enable_custom_widget_manager()
import numpy as np
import matplotlib.pyplot as plt 

fig = plt.figure()

# syntax for 3-D projection
axe = plt.gca(projection ='3d')

# Make data.
x = np.linspace(-5, 5, 200)
y = np.linspace(-5, 5, 200)

X,Y = np.meshgrid(x, y) 

# compute f(X,Y)
z = np.sin(np.sqrt(X**2 + Y**2))

axe.plot_surface(X, Y, z, cmap=plt.get_cmap("coolwarm"))

# Customize the z axis size.
axe.set_zlim(-1, 1)

很难确定这如何回答问题。你能否提供一个完整的例子来说明如何使用它? - AlexK
嗨@Aleks, 我已经添加了一个示例,请告诉我您的想法... - Rtn E
1
为了使这个解决方案起作用,似乎需要添加 !pip install ipympl%matplotlib widget,如答案所示。 - AlexK

1

1
为什么这是一个解决方案?1.5.1版本中是否存在错误?也许更好的建议是确定修复此错误的特定版本? - Glitcher
@Glitcher 依赖于特定的版本是一个好主意吗?使用 plotly-latest 是否会将用户需要决定适当版本的需求抽象化,从而使事情更加容易?很想听听你对此的想法。 - Rahul Biswas
我不确定这个程序运行的环境是什么,但在许多情况下,只有当您需要使用更新版本中的新功能或修复时才应该更新库。这是因为更新库存在固有的风险;它可能会引入错误或破坏性更改,这些更改可能没有被考虑到。 - Glitcher

1

除了@Nilesh Ingle的优秀回答之外,为了解决坐标轴和标题未显示的问题: 在调用函数configure_plotly_browser_state()时,您应该将链接https://cdn.plot.ly/plotly-1.5.1.min.js?noext(它引用了较旧版本的plotly,因此不会显示轴标签)更改为https://cdn.plot.ly/plotly-latest.min.js?noext。 希望这能帮到您!


0
从: https://dev59.com/M1YN5IYBdhLWcg3wlI7G#47230966 并结合 iplot 的帮助信息中提到的 asFigure 参数,我们可以使用以下代码在 Google Colab 上呈现交互式的 Plotly 图表。

我们可以使用以下代码在 Google Colab 上呈现交互式的 Plotly 图表

import cufflinks as cf
(dataset[column]
  .iplot(kind="box", asFigure=True) # Returns a Plotly Figure object
  .show(renderer="colab")
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接