表示する下位データがなければ,データ可視化は不可能である.本節では,描画にデータを提供する様々な方式について,データ値を直接転送してから作成までについて述べる. ColumnDataSource 使用しています CDSView それがそうです。
ColumnDataSource
CDSView
Bokehでは,値リストを描画関数に直接渡すことができる.以下の例では、データは x_values そして y_values 直接伝えることができます circle 絵の描き方(参照) 基本字を使って印刷する より多くの例を表示します)。
x_values
y_values
circle
from bokeh.plotting import figure x_values = [1, 2, 3, 4, 5] y_values = [6, 7, 2, 3, 6] p = figure() p.circle(x=x_values, y=y_values)
このようにデータを転送する時、Bokehは舞台裏で仕事をしています ColumnDataSource あなたにあげました。しかし学習作成と使用は ColumnDataSource データストリーム、描画間でデータを共有し、データをフィルタリングするなど、より高度な機能にアクセスすることができます。
♪the ColumnDataSource 多くのBokehグラフの核であり,グラフの字形で可視化されたデータを提供する.与 ColumnDataSource 例えば、複数の描画部品と小構成要素との間でデータを容易に共有することができる DataTable それがそうです。同じ時に ColumnDataSource 複数のレンダラを駆動するために、データソース選択を共有することもできる。したがって、選択ツールを用いて1つのグラフからデータ点を選択し、第2のグラフに自動的に強調表示することができる。 (リンク選択 )。
DataTable
最も基本的なレベルでは ColumnDataSource 列名とデータリスト間のマッピングのみである.♪the ColumnDataSource vt.1種類の方法をとる. data パラメータは、文字列名をキーとし、データ値のリスト(または配列)を値とする辞書である。1つの位置パラメータを ColumnDataSource 初期値設定項は data それがそうです。一旦 ColumnDataSource 作成されていれば、それを伝えることができます source 描画方法のパラメータは、列名をデータ値の代替転送として使用することができます。
data
source
from bokeh.plotting import figure from bokeh.models import ColumnDataSource data = {'x_values': [1, 2, 3, 4, 5], 'y_values': [6, 7, 2, 3, 6]} source = ColumnDataSource(data=data) p = figure() p.circle(x='x_values', y='y_values', source=source)
注釈
与えられたすべての列という暗黙的な仮定があります ColumnDataSource それらはいつでも同じ長さを持っている。したがって、一般的により望ましい方法は更新だ。 .data 属性は“一度にすべて完了”である.
.data
♪the data パラメータはパンダでもいいです DataFrame あるいは…。 GroupBy 物体です。
DataFrame
GroupBy
source = ColumnDataSource(df)
もし1つが DataFrame この列ではCDSは DataFrame それがそうです。の索引です。 DataFrame リセットされます DataFrame 命名されたインデックス列があれば、CDSにも同名の列がある。しかし、インデックス名が None CDSには共通名が指定される。はい。はい。 index もしそれが利用可能であれば level_0 そうでなければ。
None
index
level_0
準備万端整っている MultiIndex 列とインデックスは ColumnsDataSource それがそうです。インデックスについては、タプルインデックスが作成され、 MultiIndex 下線で結ぶ。列名は下線で接続される.例:
MultiIndex
ColumnsDataSource
df = pd.DataFrame({('a', 'b'): {('A', 'B'): 1, ('A', 'C'): 2}, ('b', 'a'): {('A', 'C'): 7, ('A', 'B'): 8}, ('b', 'b'): {('A', 'D'): 9, ('A', 'B'): 10}}) cds = ColumnDataSource(df)
will result in a column named index with [(A, B), (A, C), (A, D)] and columns named a_b, b_a, and b_b. This process will fail for non-string column names, so flatten the DataFrame manually in that case.
[(A, B), (A, C), (A, D)]
a_b
b_a
b_b
group = df.groupby(('colA', 'ColB')) source = ColumnDataSource(group)
もし1つが GroupBy オブジェクトは、CDSは呼び出し結果に対応する列を有する group.describe() それがそうです。♪the describe 方法は、統計的メトリック値のための列、例えば mean そして count すべての未グループ化のための元の列。生まれたのは DataFrame Vbl.はい,あります MultiIndex 元の列名および計算メトリック値を有する列は、したがって、前述のスキームを使用して平坦化される。例えばもし1つが DataFrame 列がある. 'year' そして 'mpg' それがそうです。そして通ります df.groupby('year') CDSに設定すると次のような列になります 'mpg_mean'
group.describe()
describe
mean
count
'year'
'mpg'
df.groupby('year')
'mpg_mean'
この適応能力に注意してください GroupBy 対象はパンダとのご利用のみとなっております >=0.20.0 それがそうです。
>=0.20.0
ColumnDataSource ストリーミングは新しいデータをCDSに付加する有効な方式である.使用することで stream メソッドの場合,Bokehはデータセット全体ではなく,ブラウザにのみ新しいデータを送信する.♪the stream 方法は1つを受け入れる new_data パラメータは、列名を対応する列に付加されるデータシーケンスにマッピングするDICTを含む。オプションのパラメータが必要です rollover これは,保持する最大データ長(列の先頭のデータを破棄する)である.デフォルト値. rollover 値はNoneがデータを無限に増加させることを許す.
stream
new_data
rollover
source = ColumnDataSource(data=dict(foo=[], bar=[])) # has new, identical-length updates for all columns in source new_data = { 'foo' : [10, 20], 'bar' : [100, 200], } source.stream(new_data)
使用フローの例については、参照されたい examples/app/ohlc それがそうです。
ColumnDataSource パッチを打つことはデータソーススライスを更新する有効な方法である.使用することで patch 方法:Bokehは、データセット全体ではなく、ブラウザに新しいデータを送信するだけでよい。♪the patch メソッドの場合は,適用するパッチが変更するタプルリストを表すdictに列名をマッピングすることを渡すべきである.
patch
パッチの変更を記述するタプルの形式は以下のとおりである.
(index, new_value) # replace a single column value # or (slice, new_values) # replace several column values
完全例については参照のこと examples/howto/patch_app.py それがそうです。
データをどのように追加するかを見ました ColumnDataSource バーカーの陰謀を推し進めていますこれは、非点グラフ内のフラグがどのように着色されるべきかを制御するために作成された色の列など、元のデータまたは私たち自身が明示的に変換したデータを含むことができる。また、ブラウザでのみ発生する変換を指定することもできます。これは、コードを低減する(すなわち、データを手動でカラーマッピングする必要がない)およびブラウザに送信しなければならないデータ量(元のデータのみを送信し、カラーマッピングがクライアントで発生する)を低減するために有用である。
本節では,利用可能な異なる変換対象をいくつか検討する.
ブラウザで線形カラーマッピングを行うには linear_cmap() 関数は使用可能である.それは受け入れます ColumnDataSource カラーマップ、カラーパレット(内蔵パレット名または実際の色リストであってもよい)、およびカラーマッピング範囲の最小/最大値に列する。結果を字形の色属性に渡すことができる:
linear_cmap()
fill_color=linear_cmap('counts', 'Viridis256', min=0, max=10)
以下に完全な例を示す.
import numpy as np from bokeh.plotting import figure, show from bokeh.transform import linear_cmap from bokeh.util.hex import hexbin n = 50000 x = np.random.standard_normal(n) y = np.random.standard_normal(n) bins = hexbin(x, y, 0.1) p = figure(tools="", match_aspect=True, background_fill_color='#440154') p.grid.visible = False p.hex_tile(q="q", r="r", size=0.1, line_color=None, source=bins, fill_color=linear_cmap('counts', 'Viridis256', 0, max(bins.counts))) show(p)
そのほか linear_cmap() もう一つ log_cmap() 対数比でカラーマッピングを行い、 factor_cmap() 分類データをカラーマッピングする(以下の例を参照)。
log_cmap()
factor_cmap()
分類データをタグタイプにマッピングすることも可能である.以下の例を示す factor_mark() 入力データには、異なるマークまたは異なるカテゴリが表示される。使い方もお見せしています factor_cmap() これらの同じカテゴリをカラーマッピングするためには、以下の操作を実行してください。
factor_mark()
from bokeh.plotting import figure, show from bokeh.sampledata.iris import flowers from bokeh.transform import factor_cmap, factor_mark SPECIES = ['setosa', 'versicolor', 'virginica'] MARKERS = ['hex', 'circle_x', 'triangle'] p = figure(title = "Iris Morphology") p.xaxis.axis_label = 'Petal Length' p.yaxis.axis_label = 'Sepal Width' p.scatter("petal_length", "sepal_width", source=flowers, legend_field="species", fill_alpha=0.4, size=12, marker=factor_mark('species', MARKERS, SPECIES), color=factor_cmap('species', 'Category10_3', SPECIES)) show(p)
♪the factor_mark() 変換は主に scatter 字形方法は Scatter フォントはタグタイプでパラメータ化できる.
scatter
Scatter
上の内蔵変換のほかにもう一つあります CustomJSTransform これは,任意のJavaScriptコードを指定してColumnDataSourceデータに対して変換手続きを実行することを可能にする.通常、 v_func (“ベクトル化”関数の場合)が提供される(一般的ではないのはスカラー等価項である func 必要かもしれません)。♪the v_func コードは変数に配列を入力することが期待されるべきである xs 変換された値を含むJavaScript配列を返す:
CustomJSTransform
v_func
func
xs
v_func = """ const first = xs[0] const norm = new Float64Array(xs.length) for (let i = 0; i < xs.length; i++) { norm[i] = xs[i] / first } return norm """ normalize = CustomJSTransform(v_func=v_func) plot.line(x='aapl_date', y=transform('aapl_close', normalize), line_width=2, color='#cf3c4d', alpha=0.6,legend="Apple", source=aapl_source)
上のコードは、元の価格データを第1のデータ点に対する正規化リターンシーケンスに変換する。すべての結果を以下に示す.
一般に,大きなデータセットから二次サンプリングやフィルタリングを行うデータ部分に注目する必要がある.Bokehにより、データのサブセットを表すデータソースのビューを指定することができます。データソースを見ることにより、下位データは変更する必要がなく、描画間で共有することができる。このビューは、特定のフォントに結合されるべきデータソースの行を選択する1つまたは複数のフィルタから構成される。
データサブセットを使用して描画する場合には、作成することができます CDSView そしてそれを view レンダラにパラメータを追加-メソッドを追加 Figure 例えば、 figure.circle それがそうです。♪the CDSView 2つの属性があります source そして filters それがそうです。 source はい。 ColumnDataSource このビューはそれに関連している. filters 1人前です Filter オブジェクトは、以下に列挙して説明する。
view
Figure
figure.circle
filters
Filter
from bokeh.plotting import figure from bokeh.models import ColumnDataSource, CDSView source = ColumnDataSource(some_data) view = CDSView(source=source, filters=[filter1, filter2]) p = figure() p.circle(x="x", y="y", source=source, view=view)
♪the IndexFilter 一番簡単なフィルタータイプです。これは1つあります indices 属性は、描画に含まれるデータのインデックスの整数リストである。
IndexFilter
indices
from bokeh.layouts import gridplot from bokeh.models import CDSView, ColumnDataSource, IndexFilter from bokeh.plotting import figure, show source = ColumnDataSource(data=dict(x=[1, 2, 3, 4, 5], y=[1, 2, 3, 4, 5])) view = CDSView(source=source, filters=[IndexFilter([0, 2, 4])]) tools = ["box_select", "hover", "reset"] p = figure(plot_height=300, plot_width=300, tools=tools) p.circle(x="x", y="y", size=10, hover_color="red", source=source) p_filtered = figure(plot_height=300, plot_width=300, tools=tools) p_filtered.circle(x="x", y="y", size=10, hover_color="red", source=source, view=view) show(gridplot([[p, p_filtered]]))
A BooleanFilter TrueまたはFalse値リストのデータソースから行を選択する booleans 財産です。
BooleanFilter
booleans
from bokeh.layouts import gridplot from bokeh.models import BooleanFilter, CDSView, ColumnDataSource from bokeh.plotting import figure, show source = ColumnDataSource(data=dict(x=[1, 2, 3, 4, 5], y=[1, 2, 3, 4, 5])) booleans = [True if y_val > 2 else False for y_val in source.data['y']] view = CDSView(source=source, filters=[BooleanFilter(booleans)]) tools = ["box_select", "hover", "reset"] p = figure(plot_height=300, plot_width=300, tools=tools) p.circle(x="x", y="y", size=10, hover_color="red", source=source) p_filtered = figure(plot_height=300, plot_width=300, tools=tools, x_range=p.x_range, y_range=p.y_range) p_filtered.circle(x="x", y="y", size=10, hover_color="red", source=source, view=view) show(gridplot([[p, p_filtered]]))
♪the GroupFilter データセットからクラス変数の特定の値を有する行を選択することができます。♪the GroupFilter 2つの属性があります column_name 中の列の名前。 ColumnDataSource そして、 group 選択する列の値。
GroupFilter
column_name
group
In the example below, flowers contains a categorical variable species which is either setosa, versicolor, or virginica.
flowers
species
setosa
versicolor
virginica
from bokeh.layouts import gridplot from bokeh.models import CDSView, ColumnDataSource, GroupFilter from bokeh.plotting import figure, show from bokeh.sampledata.iris import flowers source = ColumnDataSource(flowers) view1 = CDSView(source=source, filters=[GroupFilter(column_name='species', group='versicolor')]) plot_size_and_tools = {'plot_height': 300, 'plot_width': 300, 'tools':['box_select', 'reset', 'help']} p1 = figure(title="Full data set", **plot_size_and_tools) p1.circle(x='petal_length', y='petal_width', source=source, color='black') p2 = figure(title="Setosa only", x_range=p1.x_range, y_range=p1.y_range, **plot_size_and_tools) p2.circle(x='petal_length', y='petal_width', source=source, view=view1, color='red') show(gridplot([[p1, p2]]))
また1つのものを作ることができます CustomJSFilter ご自分の機能を使います。そのため,JavaScriptやTypeScriptを用いてコードを作成し,フィルタリングのサブセットを表すインデックスリストやブールリストを返す.♪the ColumnDataSource 属性関連の CDSView 追加されたこのフィルタは、レンダリング時に変数を使用します source それがそうです。
CustomJSFilter
作成するには CustomJSFilter JavaScriptで書かれたカスタム機能を用いて,JavaScriptコードを文字列としてパラメータに渡す. code :
code
custom_filter = CustomJSFilter(code=''' var indices = []; // iterate through rows of data source and see if each satisfies some constraint for (var i = 0; i < source.get_length(); i++){ if (source.data['some_column'][i] == 'some_value'){ indices.push(true); } else { indices.push(false); } } return indices; ''')
Bokehサーバアプリケーションは,データの更新やデータソースへのデータストリーミングを簡単にするが,独立文書に類似した機能を持つ必要がある場合がある.♪the AjaxDataSource この機能を提供する.
AjaxDataSource
♪the AjaxDataSource REST端点へのURLとポーリング間隔を配置した.ブラウザでは、データソースは、指定された間隔でエンドポイントにデータを要求し、ローカルにデータを更新する。既存のデータは完全に置き換えることもできるし,追加することもできる(最大構成可能なもの) max_size )。提供されたエンドポイントは、標準に一致するJSON辞書を返さなければなりません。 ColumnDataSource 書式:
max_size
{ 'x' : [1, 2, 3, ...], 'y' : [9, 3, 2, ...] }
そうでなければ、使用する AjaxDataSource 使用基準と ColumnDataSource :
source = AjaxDataSource(data_url='http://some.api.com/data', polling_interval=100) # Use just like a ColumnDataSource p.circle('x', 'y', source=source)
完全な例(以下に示す)は、 examples/howto/ajax_source.py
同じものを使う ColumnDataSource 次の2つの描画では,それらの選択を共有することが許される.
from bokeh.io import output_file, show from bokeh.layouts import gridplot from bokeh.models import ColumnDataSource from bokeh.plotting import figure output_file("brushing.html") x = list(range(-20, 21)) y0 = [abs(xx) for xx in x] y1 = [xx**2 for xx in x] # create a column data source for the plots to share source = ColumnDataSource(data=dict(x=x, y0=y0, y1=y1)) TOOLS = "box_select,lasso_select,help" # create a new plot and add a renderer left = figure(tools=TOOLS, plot_width=300, plot_height=300, title=None) left.circle('x', 'y0', source=source) # create another new plot and add a renderer right = figure(tools=TOOLS, plot_width=300, plot_height=300, title=None) right.circle('x', 'y1', source=source) p = gridplot([[left, right]]) show(p)
各フォントレンダラに使用するデータサブセットを指定することにより、描画に異なるデータサブセットを用いても、描画間でデータを共有することが容易である。同じものを使うことで ColumnDataSource このデータソースの選択およびホバリングチェックは自動的に共有される.
以下の例では、1つは CDSView Y値が250より大きいか、または100未満であるデータサブセットを指定する第2の描画のために作成される。一方の描画における選択は,別の描画に自動的に反映される.マウスを一方の描画中の一方の点にドロップすると、他方の描画における対応点(存在する場合)が強調表示される。
from bokeh.layouts import gridplot from bokeh.models import BooleanFilter, CDSView, ColumnDataSource from bokeh.plotting import figure, output_file, show output_file("linked_selection_subsets.html") x = list(range(-20, 21)) y0 = [abs(xx) for xx in x] y1 = [xx**2 for xx in x] # create a column data source for the plots to share source = ColumnDataSource(data=dict(x=x, y0=y0, y1=y1)) # create a view of the source for one plot to use view = CDSView(source=source, filters=[BooleanFilter([True if y > 250 or y < 100 else False for y in y1])]) TOOLS = "box_select,lasso_select,hover,help" # create a new plot and add a renderer left = figure(tools=TOOLS, plot_width=300, plot_height=300, title=None) left.circle('x', 'y0', size=10, hover_color="firebrick", source=source) # create another new plot, add a renderer that uses the view of the data source right = figure(tools=TOOLS, plot_width=300, plot_height=300, title=None) right.circle('x', 'y1', size=10, hover_color="firebrick", source=source, view=view) p = gridplot([[left, right]]) show(p)
Bokehはまた、ネットワークグラフィックデータおよび地理的データをレンダリングする能力を有する。これらのタイプの描画設定データの詳細については、参照されたい ネットワーク図を可視化する そして 地理データを製図する それがそうです。