如何在离线模式下使用 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 应用正在使用的端口。

这对我有用。