2017-05-19 6 views
1

bokeh DataTableのタイトルとセルとポップアップメッセージのフォントサイズを調整しようとしています。 HTMLTamplateFormatterを使用してフォントサイズを増やすと、行の高さを増やす方法がわかりません。Bokeh DataTableの行の高さと書式を調整する方法

また、列のトップ/タイトルセルの書式設定/高さを調整する方法もわかりません。

thisで提供された情報を使用してタイトルを太字にすることができました。フォントサイズを増やすために使用できる同様のコードがありますか?

私はいくつかの情報を表示したいセルをホバリングするとき、私もこれをフォーマットしたいと思います、それは可能ですか?そしてもしそうなら、どのように?

これは私が現在持っているものの最小限の例です。

import pandas 

from bokeh.models import (ColumnDataSource, TableColumn, DataTable) 
from bokeh.models.widgets import HTMLTemplateFormatter 
from bokeh.io import show 


data = pandas.DataFrame({"x": [1, 2, 3, 4], 
        "y": [200, 3, 4, 5]}) 
source = ColumnDataSource(data=data) 

columns = [] 

# column 1 with bold title: x and 200% font-size 
template200 = """ 
<div title="<%= x %>" style="font-size: 200%"> 
<%= value %> 
</div> 
""" 
htmltemplateformatter200 = HTMLTemplateFormatter(template=template200) 
col = "x" 
title = "<b>%s</b>" % col 
columns.append(TableColumn(field=col, title=title, 
          width=50, editor=None, 
          formatter=htmltemplateformatter200)) 

# column 2 with normal title: y and 400% font-size 

template400 = """ 
<div title="<%= x %>" style="font-size: 400%"> 
<%= value %> 
</div> 
""" 
htmltemplateformatter400 = HTMLTemplateFormatter(template=template400) 
col = "y" 
columns.append(TableColumn(field=col, title=col, 
          width=50, editor=None, 
          formatter=htmltemplateformatter400)) 

data_table = DataTable(source=source, columns=columns, row_headers=False, 
         sortable=False) 

show(data_table) 

このコードは、表のセル内のテキストを大きくなります。しかし、サイズを400%に変更すると、テキストが行の高さよりも大きくなり、視覚化することができます。

誰でも私にこれを手伝ってもらえますか?

乾杯、 デイブ

最初の編集:

私が行うことができるようにしたいものを表示するには:私の場合は

Table where row heights are adapted to text size

私は、私が唯一の必要があるだろうと思います私はすべてのフォントサイズを同じにしたいので、1行の高さです。

main.py:

import pandas 

from bokeh.models import (ColumnDataSource, TableColumn, DataTable) 
from bokeh.models.widgets import HTMLTemplateFormatter 
from bokeh.io import curdoc 


data = pandas.DataFrame({"x": [1, 2, 3, 4], 
         "y": [200, 3, 4, 5]}) 
source = ColumnDataSource(data=data) 

columns = [] 

# column 1 with bold title: x and 20px font-size 
template200 = """ 
<div title="<%= x %>" style="font-size: 20px;"> 
<%= value %> 
</div> 
""" 
htmltemplateformatter200 = HTMLTemplateFormatter(template=template200) 
col = "x" 
title = "<b>%s</b>" % col 
columns.append(TableColumn(field=col, title=title, 
          width=50, editor=None, 
          formatter=htmltemplateformatter200)) 


# column 2 with bold title: y and 20px font-size 
template400 = """ 
<div title="<%= y %>" style="font-size: 20px;"> 
<%= value %> 
</div> 
""" 
htmltemplateformatter400 = HTMLTemplateFormatter(template=template400) 
col = "y" 
columns.append(TableColumn(field=col, title=col, 
          width=50, editor=None, 
          formatter=htmltemplateformatter400)) 

data_table = DataTable(source=source, columns=columns, row_headers=False, 
         sortable=False, height=1000, fit_columns=True) 

curdoc().add_root(data_table) 

index.htmlを

第二編集:私は再び私のコードを見て、次の解決策を考え出したお好み焼きの返信後

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
    <script src="https://code.jquery.com/jquery-1.12.4.js"></script> 
    <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script> 
    <script> 
    $(function() { 
    $(document).tooltip(); 
    }); 
    </script> 
    <meta charset="utf-8"> 
    {{ bokeh_css }} 
    {{ bokeh_js }} 
    <style> 
     {% include 'jquery-ui.css' %} 
     {% include 'styles.css' %} 
    </style> 
    </head> 

    <body> 
    <div class="content"> 
     {{ plot_div|indent(8) }} 
    </div> 
    {{ plot_script|indent(8) }} 
    </body> 
</html> 

styles.css :

+0

ソリューションでHTMLフォーマッタを使用するだけですか?おそらくCSSシートを使う方が簡単でしょう。各セルdivのスタイルを変更してサイズを増やすことができます。ホバーに関する情報については、セルの内容を変更しますか?私はスタンドアロンのjavascriptが最もクリーンな方法だと思います。 – Anthonydouc

+0

私はHTMLフォーマッタを使用する必要はありません。私はHTML/CSSにあまり精通していません。私のボケの出力にこのようなCSSシートを追加する方法を説明できますか?私はbokehサーバーを使用しているときに、show()を使用してそれを追加するのですか?そして、私のbokehテーブルにスタンドアロンのjavascriptを組み込むにはどうすればいいですか? – DavedeKoning

+0

あなたのための最小限の例を作成します。また、行の幅を変更することに関しては、それらのすべてが同じ幅になるようにしたいでしょうか?個々の行を変更することは非常に気に入らないでしょう。 – Anthonydouc

答えて

1

このように、データ行で可変な行の高さを持つことはできません。これは、基になるJsライブラリであるSlick Gridによって設定される制限です。

https://groups.google.com/a/continuum.io/forum/#!topic/bokeh/cg01WWfpdhw ここではbokehに関連する議論がいくつかあります。

しかし、各行に簡単に変数スタイルを設定できます。これはPython内で設定できます。テキストやスタイルを変更するのは、外部のCSSシートで簡単に行えますが、HTMLフォーマッタではできますが、かなり混乱します。

次のアプリの構造を作成します(コマンドプロンプトでタイプbokeh serve --show myappを実行するために)

myapp 
    | 
    +---main.py 
    |---templates 
      +---index.html 
      +---styles.css 

(myappのディレクトリ内に含まれる)main.py

import pandas 

from bokeh.models import (ColumnDataSource, TableColumn, DataTable) 
from bokeh.models.widgets import HTMLTemplateFormatter 
from bokeh.io import show, curdoc 


x0 = [1,"8px", "red", "bold", "hover 1"] 
x1 = [2,"10px", "blue", "italic", "hover 2"] 
x2 = [3,"12px", "green", "bold", "hover 3"] 
x3 = [4,"14px", "orange", "strong", "hover 4"] 
x = [x0,x1,x2,x3] 
data = pandas.DataFrame({"x": x, 
        "y": [200, 3, 4, 5]}) 
source = ColumnDataSource(data=data) 

columns = [] 

# now in the formatter value[0] = original x value 
# value[1] = desired font size 
# value[2] = desired font color 
# value[3] = desired font style 
# value[4] = text to display on hover 
# you could feed in any styles you want, or do it externally via css + js 
template200 = """ 
<div title="<%= x %>" style="font-size: <%= value[1]%> ; 
color: <%=value[2]%>; font-weight:<%=value[3] %>;" > 
<div class = "parent_div"> 
<span class="nonhover"> <%= value[0] %> </span> 
<span class= "cell_hover"><%= value[4]%></span> </div> 
</div> 
""" 
htmltemplateformatter200 = HTMLTemplateFormatter(template=template200) 
col = "x" 
title = "<b>%s</b>" % col 
columns.append(TableColumn(field=col, title=title, 
          width=50, editor=None, 
          formatter=htmltemplateformatter200)) 

# column 2 with normal title: y and 400% font-size 

template400 = """ 
<div title="<%= x %>" style="font-size: 20px;"> 
<%= value %> 
</div> 
""" 
htmltemplateformatter400 = HTMLTemplateFormatter(template=template400) 
col = "y" 
columns.append(TableColumn(field=col, title=col, 
          width=50, editor=None, 
          formatter=htmltemplateformatter400)) 

data_table = DataTable(source=source, columns=columns, row_headers=False, 
         sortable=False,height = 1000, fit_columns=True) 

curdoc().add_root(data_table) 

Styles.cssを (ディレクトリテンプレートに含まれています) 基本的には、div内に2つのスパンがあります。それらの上にマウスを置くと、表示プロパティはnoneに設定されます。したがって、表示されません。以前は表示されていなかった他のスパンは、その表示がインラインに設定され、可視になります。これを介して、テキスト上のホバーのスタイルを変更することができます。

両方のスパンがpythonで設定されたスタイルを持つ非常に外側のdivに含まれているため、ホバーとデフォルトテキストのCSSスタイルプロパティは同じです。 (ディレクトリテンプレート内に含まれる)

.nonhover{ 
display: inline; 
} 

.cell_hover{ 
display: none; 
background: yellow; 
} 

.parent_div:hover .nonhover{ 
display: none; 
} 

.parent_div:hover .cell_hover{ 
display: inline; 
background: yellow; 
} 

index.htmlを

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
    <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/0.10.0/lodash.min.js"></script> 
    <meta charset="utf-8"> 
    {{ bokeh_css }} 
    {{ bokeh_js }} 
    <style> 
     {% include 'styles.css' %} 
    </style> 
    </head> 

    <body> 
    <div class="content"> 
     {{ plot_div|indent(8) }} 
    </div> 
    {{ plot_script|indent(8) }} 
    </body> 
</html> 

まだお役に立てば幸いです。

+0

あなたの例と努力をありがとう:)私は非常に感謝しています。それは私をたくさん助けました。あなたの答えに言及してください:あなたはあなたが望むどんなスタイルでも、フィードを送ることができます。あるいは、CSS + jsを介して外部で行うことができます。 私は追加のjを入れる方法がわかりません。私はこれに全く慣れていない。だから、私はjsファイルを持っていて、これをやろうとするとメッセージが表示されます: ローカルリソースを読み込むことができません。 bokehがなければ、ローカルファイルを参照してhtmlを開くことができました。これはどのように作動しますか? – DavedeKoning

+1

あなたのスクリプトがindex.htmlと同じフォルダにある場合は、これをhtmlファイルの先頭に挿入することができます:。残念ながら、任意のパスを指定する方法は完全にはわかりません。答えがupvoteし、正しいとマークしてくれた場合は、ありがとう。 – Anthonydouc

関連する問題