Google Colab中的交互式matplotlib图形

3z6pesqy  于 2023-05-01  发布在  Go
关注(0)|答案(6)|浏览(247)

通常在jupyter笔记本上我会使用%matplotlib notebook magic来显示一个交互窗口,但是这似乎不适用于google colab。有没有解决方案,或者是不可能在google colab中显示交互式窗口?

ecr0jaav

ecr0jaav1#

下面是在Plotly中创建交互式iplot()和在Google Colab Notebook上创建cufflinks()的示例。答案[1,[2]](https://colab.research.google.com/drive/14oudHx5e5r7hm1QcbZ24FVHXgVPD0k8f)中使用的功能和建议
关键似乎是将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()

设置notebook为false

init_notebook_mode(connected=False)

为Colab创建函数复制自:[1、[2]](https://colab.research.google.com/drive/14oudHx5e5r7hm1QcbZ24FVHXgVPD0k8f)

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-1.5.1.min.js?noext',
            },
          });
        </script>
        '''))

**创建示例 Dataframe **

数据来源:佐治亚州桃树市的年度降雨量数据来自国家气象局3(https://www.weather.gov/ffc/rainfall_scorecard)。

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')
plt.show()

输出:x1c 0d1x

[Note:x,y,标题不显示!现在是]

zfycwa2u

zfycwa2u2#

面对同样的问题(在大量阅读之后),我无法让%matplotlib ipympl/widget magic与Colab一起工作。然而,下一个最好的解决方案确实是使用Plotly,正如@Nilesh Ingle在他的详细回复中所概述的那样。
然而,有一个简单得多的方法来让Plotly在Colab中启动和运行。
请参阅此shared Colab notebook的最小示例。
下面也复制了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()
uz75evzq

uz75evzq3#

这似乎是一个后端问题。在jupyter notebook中,列出不同类型的后端的命令是:

%matplotlib --list

输出:

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

但是,对于我的系统/设置,只有‘notebook‘和另一个工作。在jupyter实验室,对我来说,没有一个后端可以用于交互式图形(即使是他们推荐的“内联”)。
希望它减少了我经历的搜索和安装/重新安装的时间:))

xqk2d5yq

xqk2d5yq4#

除了@Nilesh Ingle出色的回答,为了解决轴和标题不显示的问题:当调用函数configure_plotly_browser_state()中的脚本时,你应该通过https://cdn.plot.ly/plotly-1.5.1.min.js?noext更改链接https://cdn.plot.ly/plotly-1.5.1.min.js?noext(它指的是plotly的旧版本,因此不显示轴标签)。希望这会有帮助!

x6492ojm

x6492ojm5#

对Nilesh Ingle精彩答案的一个小更正https://stackoverflow.com/a/55435199/13705497
为了消除轴和标题不显示的问题-您可以在函数configure_plotly_browser_state()中将链接https://cdn.plot.ly/plotly-1.5.1.min.js?noext(此链接是罪魁祸首)更改为https://cdn.plot.ly/plotly-latest.min.js?noext。祝你今天愉快!

uttx8gqw

uttx8gqw6#

下面是一个获取交互式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)

相关问题