如何在离线模式下使用 Plotly?
How to use Plotly in offline mode?
在厌倦了 Matplotlib 之后,我正在考虑使用 Plotly。我制作了一个简单的图,但是,每当我尝试创建图时,浏览器都会打开并且它正在寻找 "cdn cloudflare" 或类似的东西。它在这里挂了大约一分钟,然后终于显示了一些情节。有些地块甚至不呈现,例如 Scattergeo。关于如何去除这些依赖性的任何想法?我在没有外部连接的网络上工作。
注意:这是测试代码。将 if False 更改为 if True 以 运行 那部分代码。我也在使用 Plotly 版本 4.7.1
这是一些示例代码。
import plotly
import plotly.graph_objects as go
import plotly.io as pio
import numpy as np
import pandas as pd
pio.renderers.default = "browser"
size = 100
#Stacked Plot
if False:
fig = go.Figure()
#Data Creation
y1 = np.random.randint(0,50,size)
y2 = 50 - np.random.randint(0,25,size)
y3 = 100 - (y2+y1)
x = np.linspace(0,100,size)
#Plot Essentials
g = [go.Scatter(x=x,y=y1,mode='lines+markers',stackgroup='1',name='money'),
go.Scatter(x=x,y=y2,mode='lines+markers',stackgroup='1',name='credit'),
go.Scatter(x=x,y=y3,mode='lines+markers',stackgroup='1',name='IOU')]
for s in g:
fig.add_trace(s)
fig.update_layout(title=dict(text='Resource Plot'),
xaxis = dict(title = dict(text='Time (s)')),
yaxis = dict(title = dict(text='Resources Used (%)'),
ticksuffix = '%'))
pio.show(fig)
### Scatter Map Plot
if False:
fig = go.Figure()
#Data Creation
d = {'Lat':np.random.randint(90,120,size),
'Lon':np.random.randint(-180,180,size),
'colorcode':np.random.randint(-40,20,size)}
df = pd.DataFrame(d)
fig.add_trace(go.Scattergeo(mode = "markers+lines",lon = df['Lon'],lat = df['Lat'],marker = {'size': 10,'color':df['colorcode'],'colorscale':'jet','colorbar_thickness':20}))
fig.update_layout( geo = dict(
showland = True,
showcountries = True,
showocean = True,
countrywidth = 0.5,
landcolor = 'rgb(230, 145, 56)',
lakecolor = 'rgb(0, 255, 255)',
oceancolor = 'rgb(0, 255, 255)',
projection = dict(
type = 'orthographic',
),
lonaxis = dict(
showgrid = True,
gridcolor = 'rgb(102, 102, 102)',
gridwidth = 0.5
),
lataxis = dict(
showgrid = True,
gridcolor = 'rgb(102, 102, 102)',
gridwidth = 0.5
)
)
)
pio.show(fig)
编辑:我打算在 QWebEngine 中渲染这些图,它将嵌入到我们的 PyQt5 GUI 中以供分析。如果我现在可以让它们在网络浏览器中呈现就可以了,因为我们可以访问 Firefox,但没有互联网连接。
编辑:半工作答案。来自 plotly.offline 导入地块
plot(fig) 适用于某些地块。但我仍然对 Scattergeo 图有疑问,因为 html 它仍然引用 www.w3.org。对地图有什么建议吗?
在离线模式下制作图表最流行的方法是使用plotly的iplot函数,这里有一个例子;
from plotly.offline import iplot, init_notebook_mode
from plotly.subplots import make_subplots
init_notebook_mode()
import plotly.graph_objs as go
trace = go.Scatter(
x=aList,
y=aDiffList,
name=a_name,
mode='markers',
marker={'color' : 'rgb(0, 0, 0)', 'size' : 6}
)
data = [trace]
layout = {'title' :
{'text' : '<b>Title in Bold'}, 'x' : .5,
'font' : {'size' : 24, 'family' : 'Raleway'}
}
iplot({'data' : data, 'layout' : layout})
我认为使用 iplot 会使您的代码正常工作
这里是使用地图和所有东西的方法。
创建 Flask 应用。
import os
import sys
from flask import Flask
from flask_cors import CORS,cross_origin
import json
import argparse
from flask import session, redirect, url_for, render_template, request
app = Flask(__name__,template_folder='templates')
CORS(app)
file_dir = os.path.dirname(os.path.realpath(__file__))
@app.route('/plotlygeojsonfile/<path:relative_path>',methods=['GET','POST'])
@cross_origin()
def get_topojson(relative_path):
i = json.load(open(os.path.join(file_dir,relative_path),'r'))
return json.dumps(i)
if __name__ == "__main__":
my_parser = argparse.ArgumentParser()
my_parser.version = '0.1.0'
my_parser.add_argument('-port',default=5000)
my_parser.add_argument('-host',default='127.0.0.1')
args = my_parser.parse_args()
port = args.port
host = args.host
app.run(debug = True, port=port, host=host)
这应该在 Flask 文件夹中 [我的名字叫 Flask]。
在目录 Flask/plotly/topojson 中,您需要放置来自 http://cdn.plot.ly/{json 的 usa_50m.json、usa_110m.json、world_50mjson 和 world110m.json 的下载版本] file here} 对于这句话前面列出的每个 topojson 文件。只需导航至该页面并将 json 保存在该 Flask/plotly/topojson 文件夹中。
每当你做一个plotly.offline.plot(figure,config=config)
调用,你的配置字典需要至少包括以下内容。
config = {'topojsonURL':f'http://{hostname}:{port}/plotlygeojsonfile/plotly/topojson/'}
其中主机名是 Flask 应用 运行 所在机器的主机名,端口是 Flask 应用正在使用的端口。
这对我有用。
在厌倦了 Matplotlib 之后,我正在考虑使用 Plotly。我制作了一个简单的图,但是,每当我尝试创建图时,浏览器都会打开并且它正在寻找 "cdn cloudflare" 或类似的东西。它在这里挂了大约一分钟,然后终于显示了一些情节。有些地块甚至不呈现,例如 Scattergeo。关于如何去除这些依赖性的任何想法?我在没有外部连接的网络上工作。
注意:这是测试代码。将 if False 更改为 if True 以 运行 那部分代码。我也在使用 Plotly 版本 4.7.1
这是一些示例代码。
import plotly
import plotly.graph_objects as go
import plotly.io as pio
import numpy as np
import pandas as pd
pio.renderers.default = "browser"
size = 100
#Stacked Plot
if False:
fig = go.Figure()
#Data Creation
y1 = np.random.randint(0,50,size)
y2 = 50 - np.random.randint(0,25,size)
y3 = 100 - (y2+y1)
x = np.linspace(0,100,size)
#Plot Essentials
g = [go.Scatter(x=x,y=y1,mode='lines+markers',stackgroup='1',name='money'),
go.Scatter(x=x,y=y2,mode='lines+markers',stackgroup='1',name='credit'),
go.Scatter(x=x,y=y3,mode='lines+markers',stackgroup='1',name='IOU')]
for s in g:
fig.add_trace(s)
fig.update_layout(title=dict(text='Resource Plot'),
xaxis = dict(title = dict(text='Time (s)')),
yaxis = dict(title = dict(text='Resources Used (%)'),
ticksuffix = '%'))
pio.show(fig)
### Scatter Map Plot
if False:
fig = go.Figure()
#Data Creation
d = {'Lat':np.random.randint(90,120,size),
'Lon':np.random.randint(-180,180,size),
'colorcode':np.random.randint(-40,20,size)}
df = pd.DataFrame(d)
fig.add_trace(go.Scattergeo(mode = "markers+lines",lon = df['Lon'],lat = df['Lat'],marker = {'size': 10,'color':df['colorcode'],'colorscale':'jet','colorbar_thickness':20}))
fig.update_layout( geo = dict(
showland = True,
showcountries = True,
showocean = True,
countrywidth = 0.5,
landcolor = 'rgb(230, 145, 56)',
lakecolor = 'rgb(0, 255, 255)',
oceancolor = 'rgb(0, 255, 255)',
projection = dict(
type = 'orthographic',
),
lonaxis = dict(
showgrid = True,
gridcolor = 'rgb(102, 102, 102)',
gridwidth = 0.5
),
lataxis = dict(
showgrid = True,
gridcolor = 'rgb(102, 102, 102)',
gridwidth = 0.5
)
)
)
pio.show(fig)
编辑:我打算在 QWebEngine 中渲染这些图,它将嵌入到我们的 PyQt5 GUI 中以供分析。如果我现在可以让它们在网络浏览器中呈现就可以了,因为我们可以访问 Firefox,但没有互联网连接。
编辑:半工作答案。来自 plotly.offline 导入地块
plot(fig) 适用于某些地块。但我仍然对 Scattergeo 图有疑问,因为 html 它仍然引用 www.w3.org。对地图有什么建议吗?
在离线模式下制作图表最流行的方法是使用plotly的iplot函数,这里有一个例子;
from plotly.offline import iplot, init_notebook_mode
from plotly.subplots import make_subplots
init_notebook_mode()
import plotly.graph_objs as go
trace = go.Scatter(
x=aList,
y=aDiffList,
name=a_name,
mode='markers',
marker={'color' : 'rgb(0, 0, 0)', 'size' : 6}
)
data = [trace]
layout = {'title' :
{'text' : '<b>Title in Bold'}, 'x' : .5,
'font' : {'size' : 24, 'family' : 'Raleway'}
}
iplot({'data' : data, 'layout' : layout})
我认为使用 iplot 会使您的代码正常工作
这里是使用地图和所有东西的方法。
创建 Flask 应用。
import os
import sys
from flask import Flask
from flask_cors import CORS,cross_origin
import json
import argparse
from flask import session, redirect, url_for, render_template, request
app = Flask(__name__,template_folder='templates')
CORS(app)
file_dir = os.path.dirname(os.path.realpath(__file__))
@app.route('/plotlygeojsonfile/<path:relative_path>',methods=['GET','POST'])
@cross_origin()
def get_topojson(relative_path):
i = json.load(open(os.path.join(file_dir,relative_path),'r'))
return json.dumps(i)
if __name__ == "__main__":
my_parser = argparse.ArgumentParser()
my_parser.version = '0.1.0'
my_parser.add_argument('-port',default=5000)
my_parser.add_argument('-host',default='127.0.0.1')
args = my_parser.parse_args()
port = args.port
host = args.host
app.run(debug = True, port=port, host=host)
这应该在 Flask 文件夹中 [我的名字叫 Flask]。
在目录 Flask/plotly/topojson 中,您需要放置来自 http://cdn.plot.ly/{json 的 usa_50m.json、usa_110m.json、world_50mjson 和 world110m.json 的下载版本] file here} 对于这句话前面列出的每个 topojson 文件。只需导航至该页面并将 json 保存在该 Flask/plotly/topojson 文件夹中。
每当你做一个plotly.offline.plot(figure,config=config) 调用,你的配置字典需要至少包括以下内容。
config = {'topojsonURL':f'http://{hostname}:{port}/plotlygeojsonfile/plotly/topojson/'}
其中主机名是 Flask 应用 运行 所在机器的主机名,端口是 Flask 应用正在使用的端口。
这对我有用。