ボケガイドには、作成できるさまざまな棒グラフの例があります。 http://docs.bokeh.org/en/0.10.0/docs/user_guide/charts.html#id4
このコードは1つを作成します:
from bokeh.charts import Bar, output_file, show
from bokeh.sampledata.autompg import autompg as df
p = Bar(df, 'cyl', values='mpg', title="Total MPG by CYL")
output_file("bar.html")
show(p)
私の質問は、チャートの個々のバーにデータラベルを追加できるかどうかです。オンラインで検索しましたが、明確な答えが見つかりませんでした。
Labelsetを使用して、個々のバーにラベルを作成します
私の例では、プロットインターフェイスでvbarを使用しています。これは、グラフインターフェイスよりも少し低レベルですが、棒グラフに追加する方法があるかもしれません。
from bokeh.palettes import PuBu
from bokeh.io import show, output_notebook
from bokeh.models import ColumnDataSource, ranges, LabelSet
from bokeh.plotting import figure
output_notebook()
source = ColumnDataSource(dict(x=['Áætlaðir','Unnir'],y=[576,608]))
x_label = ""
y_label = "Tímar (klst)"
title = "Tímar; núllti til þriðji sprettur."
plot = figure(plot_width=600, plot_height=300, tools="save",
x_axis_label = x_label,
y_axis_label = y_label,
title=title,
x_minor_ticks=2,
x_range = source.data["x"],
y_range= ranges.Range1d(start=0,end=700))
labels = LabelSet(x='x', y='y', text='y', level='glyph',
x_offset=-13.5, y_offset=0, source=source, render_mode='canvas')
plot.vbar(source=source,x='x',top='y',bottom=0,width=0.3,color=PuBu[7][2])
plot.add_layout(labels)
show(plot)
ラベルセットの詳細については、こちらをご覧ください: ボケ注釈
BOKEH MAINTAINERSからのメモbokeh.charts
を参照する以下の回答の部分は、歴史的な関心のみです。 bokeh.charts
APIは非推奨になり、その後Bokehから削除されました。安定したbokeh.plotting
APIについては、上記の回答を参照してください。
はい、チャートの各バーにラベルを追加できます。これを行うにはいくつかの方法があります。デフォルトでは、ラベルはデータに関連付けられています。ただし、表示内容は変更できます。あなたの例を使用してそれを行ういくつかの方法があります:
from bokeh.charts import Bar, output_file, show
from bokeh.sampledata.autompg import autompg as df
from bokeh.layouts import gridplot
from pandas import DataFrame
from bokeh.plotting import figure, ColumnDataSource
from bokeh.models import Range1d, HoverTool
# output_file("bar.html")
""" Adding some sample labels a few different ways.
Play with the sample data and code to get an idea what does what.
See below for output.
"""
サンプルデータ(新しいラベル):
新しいデータフレーム列を決定するために、いくつかのロジックを使用しました。もちろん、すでにdf
にある別の列を使用することもできます(すべて、作業しているデータによって異なります)。ここで本当に必要なのは、データフレームに新しい列を指定することだけです。
# One method
labels = []
for number in df['cyl']:
if number == 3:
labels.append("three")
if number == 4:
labels.append("four")
if number == 5:
labels.append("five")
if number == 6:
labels.append("six")
if number == 8:
labels.append("eight")
df['labels'] = labels
新しいデータフレーム列を取得する別の方法。繰り返しますが、棒グラフで使用する新しい列をdf
に指定する必要があります。
# Another method
def new_labels(x):
if x % 2 != 0 or x == 6:
y = "Inline"
Elif x % 2 == 0:
y = "V"
else:
y = "nan"
return y
df["more_labels"] = df["cyl"].map(new_labels)
棒グラフ:
私はそれを2つの方法で行いました。 p1は、新しいラベルを指定するだけです。文字列を使用したため、グラフ上でアルファベット順に並べられていることに注意してください。 p2は元のラベルを使用し、さらに同じバーに新しいラベルを追加します。
# Specifying your labels
p1 = Bar(df, label='labels', values='mpg',
title="Total MPG by CYL, remapped labels, p1",
width=400, height=400, legend="top_right")
p2 = Bar(df, label=['cyl', 'more_labels'], values='mpg',
title="Total MPG by CYL, multiple labels, p2", width=400, height=400,
legend="top_right")
別の方法:
Bokehには、3つの主要な「インターフェイスレベル」があります。高レベルのcharts
は、すばやく簡単にアクセスできますが、機能が制限されています。 plotting
これはより多くのオプションを提供します。 models
はさらに多くのオプションを提供します。
ここでは、プロットインターフェイスとFigure
メソッドを含むrect
クラスを使用しています。これにより、チャートをより詳細に制御できます。
# Plot with "intermediate-level" bokeh.plotting interface
new_df = DataFrame(df.groupby(['cyl'])['mpg'].sum())
factors = ["three", "four", "five", "six", "eight"]
ordinate = new_df['mpg'].tolist()
mpg = [x * 0.5 for x in ordinate]
p3 = figure(x_range=factors, width=400, height=400,
title="Total MPG by CYL, using 'rect' instead of 'bar', p3")
p3.rect(factors, y=mpg, width=0.75, height=ordinate)
p3.y_range = Range1d(0, 6000)
p3.xaxis.axis_label = "x axis name"
p3.yaxis.axis_label = "Sum(Mpg)"
特定のラベルを追加する4番目の方法:
ここでは、hover
プロットツールを使用しています。各バーにカーソルを合わせると、指定したラベルが表示されます。
# With HoverTool, using 'quad' instead of 'rect'
top = [int(x) for x in ordinate]
bottom = [0] * len(top)
left = []
[left.append(x-0.2) for x in range(1, len(top)+1)]
right = []
[right.append(x+0.2) for x in range(1, len(top)+1)]
cyl = ["three", "four", "five", "six", "eight"]
source = ColumnDataSource(
data=dict(
top=[int(x) for x in ordinate],
bottom=[0] * len(top),
left=left,
right=right,
cyl=["three", "four", "five", "six", "eight"],
)
)
hover = HoverTool(
tooltips=[
("cyl", "@cyl"),
("sum", "@top")
]
)
p4 = figure(width=400, height=400,
title="Total MPG by CYL, with HoverTool and 'quad', p4")
p4.add_tools(hover)
p4.quad(top=[int(x) for x in ordinate], bottom=[0] * len(top),
left=left, right=right, color="green", source=source)
p4.xaxis.axis_label = "x axis name"
4つのグラフすべてをグリッドに表示します。
grid = gridplot([[p1, p2], [p3, p4]])
show(grid)
これらは私が知っている方法です。他にもあるかもしれません。ニーズに合わせて好きなように変更してください。これらすべてを実行すると出力されるものは次のとおりです(ホバーツールを取得するには、実行するか、提供する必要があります)。