15

個人の Web サイトにボケ プロットを静的に埋め込もうとしていますが、理解できない動作に遭遇しています。基本的に、次のようにボケを使用してプロットを生成しています。

import bokeh.plotting as bplt
import numpy as np

x=np.random.random(100)
y=np.random.random(100)

bplt.output_file("t.html")
plot=bplt.line(x,y)

##the following line refers to the bokeh installed on my home computer
print plot.create_html_snippet(
           static_path='/usr/local/lib/python2.7/site-packages/bokeh/server/static/')

##the following line refers to the bokeh installed on my remote computer
#print plot.create_html_snippet(
#           static_path='/opt/anaconda/lib/python2.7/site-packages/bokeh/server/static/')

ここまでは順調ですね。これにより、次のようなファイルが生成(random garbage).embed.jsされ、 と呼んでいる html ファイルに手動でコピーした html 構文を含む文字列が出力されますtestembed.html。これを以下に再現しました。

<html>
<body>

<h2>Simple Embed Example</h2>
<p>This is where my plot should be:</p>
<p>
<!--The next 4 lines are the output of the print statement from the python code-->
<script src="ccbd451a-6995-4dd2-b99c-e4140b362997.embed.js"
        bokeh_plottype="embeddata"
        bokeh_modelid="ccbd451a-6995-4dd2-b99c-e4140b362997"
        bokeh_modeltype="Plot" async="true"></script>
</p>

</body>
</html>

Python コードでローカルのPython インストールを参照し、生成されたファイル (.html および .embed.js) をローカル コンピューターにコピーすると、html ファイルにプロットが表示されます。

しかし、私が本当にやりたいことは、これをリモート コンピューターで実行し、個人用サイトの Web 経由で html ファイルにアクセスできるようにすることです。

リモート コンピューターのpython インストールをstatic_path参照すると(上記のようにコメント アウトされています) 、Web 経由でアクセスすると (つまり、 http://mywebsite.com/に移動すると) 、html ページにプロットが表示されません。 testembed.html )。なぜこれが起こっているのか分かりません。

参考までに、htmlスニペット関数が定義されているコードは次のとおりです 。、つまり 、 これと関係がある可能性があります。create_html_snippetembed_base_url

前もって感謝します!マイク

EDIT 私はbigreddot問題を解決したのアドバイスを受けました。私が抱えていた実際の問題は、私が使用していた Web サーバーが、セキュリティ上の理由から、自分のpublic_htmlディレクトリ内のものにしかアクセスできないことでした。回避策はrsyncbokeh/staticディレクトリを my に移動し、public_htmlそれを指すことでした:

rsync -ax /opt/anaconda/lib/python2.7/site-packages/bokeh/server/static/ /home/myusername/public_html/bokeh-static/

次に、次のようにコードを変更します。

import bokeh.plotting as bplt
import numpy as np

x=np.random.random(100)
y=np.random.random(100)

bplt.output_file("t.html")
plot=bplt.line(x,y)


#the following line refers to the bokeh rsynced to my directory
print plot.create_html_snippet(
           static_path='http://www.my_server_website/~myusername/bokeh-static/', 
           embed_base_url = 'http://www.my_server_website/~myusername/where_.js_file_is_located')

そして、生成されたhtmlを明らかにコピーしますtestembed.html

4

2 に答える 2

20

更新:create_html_snippet元の質問で言及された機能は、何年も前に廃止され、削除されました。bokeh.embedモジュールで利用可能な Bokeh コンテンツを埋め込むさまざまな新しい方法が利用できるようになりました。この回答では、それらのいくつかを要約します。

スタンドアロン コンテンツ

スタンドアロン Bokeh コンテンツは、実行中の Bokeh サーバーによってサポートされていない純粋な HTML/JS/CSS です。ただし、スタンドアロンの Bokeh コンテンツは、プロット ツール (パン、ズーム、選択など)、リンクされたブラッシング、および CustomJS アクションをトリガーするウィジェットを使用して、高度にインタラクティブにすることができます。スタンドアロン コンテンツを埋め込む方法はいくつかあります。

json_item

JS 関数でロードできるコンテンツの純粋な JSON 表現を作成する場合は、json_item関数を使用できます。例として、Flask エンドポイントから JSON をサーバー化する場合があります。

@app.route('/plot')
def plot():
    p = make_plot('petal_width', 'petal_length')
    return json.dumps(json_item(p, "myplot"))

次に、ページは次のような JavaScript コードを使用してコンテンツを読み込んでレンダリングできます。

<div id="myplot"></div>

<script>
fetch('/plot')
    .then(function(response) { return response.json(); })
    .then(function(item) { Bokeh.embed.embed_item(item); })
</script>

CDN.render()これは、たとえばページの でテンプレート化することによって、BokehJS ライブラリをページにロードしたことを前提として<head>います。ここで完全な最小限の例を参照してください。

components

単純な<script>タグを生成<div>し、ページにテンプレート化できる場合は、次のcomponents関数を使用できます。

from bokeh.plotting import figure
from bokeh.embed import components

plot = figure()
plot.circle([1,2], [3,4])

script, div = components(plot)

返されたscriptand div(または複数のアイテムを渡す場合は div) をページに挿入できます。

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>Bokeh Scatter Plots</title>

        <!-- COPY/PASTE BOKEHJS RESOURCES HERE -->

        <!-- COPY/PASTE SCRIPT HERE -->

    </head>
    <body>
        <!-- INSERT DIVS HERE -->
    </body>
</html>

上記のように、ページ ヘッドの BokehJS JS および CSS リソースをハードコードまたはテンプレート化する必要があります。CDN.render()

file_html

<head></head><body></body>完全な HTML ページ全体 (つまり を含む)を生成したい場合は、次のfile_html関数を使用できます。

from bokeh.plotting import figure
from bokeh.resources import CDN
from bokeh.embed import file_html

plot = figure()
plot.circle([1,2], [3,4])

html = file_html(plot, CDN, "my plot")

これにより、保存や提供などが可能な基本的なページが生成されます。必要に応じて、独自の Jinja テンプレートを指定することもできます (詳細についてはドキュメントを参照してください)。

ボケ サーバー アプリケーション

Bokeh サーバー アプリケーションは、Bokeh プロットとウィジェットをライブ実行中の Python プロセスに接続できるため、UI インタラクション、選択、ウィジェット操作などのイベントによって、実際の Python コード (Pandas や scikit-learn など) をトリガーできます。

基本的な Bokeh アプリケーションをページ テンプレートに埋め込むには、次の方法を使用するのが最も一般的な方法ですserver_document

from bokeh.embed import server_document
script = server_document("https://demo.bokeh.org/slider")

返さscriptれた は HTML ページの任意の場所にテンプレート化でき、そこに Bokeh アプリケーションが表示されます。アプリ コンポーネントを個別に埋め込む、ユーザー向けにセッションをカスタマイズする、プロキシ/ロード バランサーの背後で実行するなど、他にも多くの可能性があります。Bokeh サーバーも、埋め込みページへのアクセスを許可するように構成する必要がある場合があります。詳細については、ユーザー ガイドの「 Bokeh サーバーの実行」の章を参照してください。

Bokeh サーバー アプリケーションを「埋め込む」もう 1 つの簡単な方法は、実行中の Bokeh アプリのパブリック URL を指す IFrame を使用することです。

于 2014-07-17T12:38:18.263 に答える
3

編集: この回答の情報は、Bokeh の非常に古いバージョンに関するものであり、使用法には関係ありません。


embed_base_urlJavaScript が埋め込みファイルを検索する URL パス (絶対パスまたは相対パス) を制御します。

embed_save_locPython が埋め込みファイルを書き出すディレクトリを制御します。server=True の場合、embed_save_loc は必要ありません。

static_pathjavascript が bokeh.js および bokeh.css の URL を構築するために使用する URL パス (絶対パスまたは相対パス) を制御します。デフォルトでhttp://localhost:5006/static/は ですが、CDN を簡単に指すこともできます

bokeh サーバーを実行している場合は、 に移動しhttp://localhost:5006/bokeh/generate_embed/staticます。バグのため、マスターで実行する必要があると思います。

編集: CDN は「コンテンツ配信ネットワーク」です。これは、ファイル サーバーの単なる派手な用語です。たとえば、誰でも利用できるようにhttp://cdn.bokeh.org/bokeh-0.4.2.js (またはhttp://cdn.bokeh.org/bokeh-0.4.2.min.js ) でbokeh.js をホストしています。使用する。

于 2014-03-13T22:27:28.260 に答える