如何使用货币格式设置bokeh x轴刻度

3

我正在使用Jupyter笔记本制作一个子弹图来比较两个值。图表已经渲染出来了,但我想要格式化x轴刻度线以显示货币符号。 以下是我目前的代码...

project = "Rocket"
targetspend = 15000
spend2date = 16600
data = [(project, targetspend, spend2date)]

from bokeh.io import show, output_notebook
from bokeh.plotting import figure

def make_bokeh_spend_bullet(data):
  output_notebook()
  if len(data) ==1:
      ph = 135

  elif len(data) >1 and len(data) < 3:
    ph =165
  else:
    ph = ( 6 * len(data) * 10)


  if data[0][2] < data[0][1] * 2:
    perf = data[0][2]
    limits = [0, data[0][1], data[0][1] *2]
  else:
    perf = data[0][2]
    limits = [0, data[0][1], data[0][2]]

  labels = ["OK", "Over budget", ]
  cats = [x[0] for x in data]

  p=figure(title="Project Spend", plot_height=ph, plot_width=600, y_range=cats)
  p.x_range.range_padding = 0
  p.grid.grid_line_color = None
  p.xaxis[0].ticker.num_minor_ticks = 0
  #p.xaxis[0].ticker.format('$0,0')

  for left, right, color in zip(limits[:-1], limits[1:], OrRd3[::-1]):
    p.hbar(y=cats, left=left, right=right, height=0.8, color=color)


  for x in data:
    if x[2] > x[1]:
      p.hbar(y=cats, left=0, right=perf, height=0.3, color="firebrick")
    else:
      p.hbar(y=cats, left=0, right=perf, height=0.3, color="gray")

  comp = [x[1] for x in data]
  p.segment(x0=comp, y0=[(x, -0.5) for x in cats], x1=comp,
          y1=[(x, 0.5) for x in cats], color="black", line_width=2)

  for start, label in zip(limits[:-1], labels):
    p.add_layout(Label(x=start, y=0, text=label, text_font_size="10pt",
                       text_color='black', y_offset=5, x_offset=15)) 
  return show(p)

output_notebook()

p = make_bokeh_spend_bullet(data)

我从bokeh文档中了解到一个名为NumeralTickFormatter(**kwargs)的类,但是不清楚如何在我的图表中使用此格式选项。

输入图像描述


我找到了窍门... - Timothy Lombard
我在文档中一直摸索,找到了一个解决方案。1. 添加另一个导入,如下所示:from bokeh.models import NumeralTickFormatter然后更新x轴的赋值,使用导入的格式化程序,如下所示:p.xaxis[0].formatter = NumeralTickFormatter(format="$0")这给了我想要的输出结果。 - Timothy Lombard
4个回答

5

信不信由你,但这似乎只适用于美元货币。我无法使其与欧元货币符号一起正常工作。有什么特殊的技巧吗?

例如,以下代码可以正常工作:

    plot.handles['yaxis'].formatter = NumeralTickFormatter(format="0,0 $")

而这个并没有产生任何货币符号:

    plot.handles['yaxis'].formatter = NumeralTickFormatter(format="0,0 €")

1
如果你和我一样,来到这里是因为你需要在刻度上加上欧元符号,那么这个方法对我很有效: plot.yaxis.formatter = PrintfTickFormatter(format="€ %s") - Chris Molanus
这在我使用 bokeh 的 v2.2.0 版本时实际上并没有起作用。 - astrochun

4
代码只需要再稍微改进一下就可以了。
from bokeh.models import Label, Title, NumeralTickFormatter

然后,将另一个分配添加到 x 轴。
p.xaxis[0].formatter = NumeralTickFormatter(format="$0")

以下是新图表: enter image description here

1

在使用bokeh==2.2.0时,我遇到了一些问题,无法让@PaLi的代码正常工作。最终我想要的是像"$500k"这样的格式,而不是"$500,000"。通过使用PrintfTickFormatter的建议,我成功地实现了以下内容:

p.xaxis[0].formatter = PrintfTickFormatter(format="$%ik")

1
这段代码为 bokeh 的 y 轴提供了千位分隔符格式:

p.yaxis[0].formatter = NumeralTickFormatter(format="0,0")


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接