在散景条形图中选择条形顺序

Choosing order of bars in Bokeh bar chart

作为尝试学习使用 Bokeh 的一部分,我正在尝试制作一个简单的条形图。我按特定顺序(星期几)传递标签,而 Bokeh 似乎按字母顺序对它们进行排序。如何让条形图按照原始列表的顺序显示?

from bokeh.plotting import show
from bokeh.io import output_notebook
from bokeh.charts import Bar
from collections import OrderedDict
import calendar 

output_notebook()

data = OrderedDict()
data['values'] = [2,3,4,5,6,7,8] #values only ascending to make correct graph clear
data['days'] = [calendar.day_name[i-1] for i in range(7)]
p = Bar(data, label='days', values='values', 
         title='OrderedDict Input',xlabel="Day", ylabel="Value")
show(p)

Output generated

我不太喜欢条形图等高级图表。它们不是很可定制。 构建它们 'by hand' 通常更容易 - 而且不需要更长的时间。这就是我要做的:

from bokeh.plotting import figure
from bokeh.io import output_file, show
import calendar

values = [2,3,4,5,6,7,8]
days = [calendar.day_name[i-1] for i in range(1,8)]

p = figure(x_range=days)
p.vbar(x=days, width=0.5, top=values, color = "#ff1200")

output_file('foo.html')
show(p)

产生:

来自 Bokeh 项目维护者的注释: 这个答案指的是一个过时和弃用的 API,不应在任何新代码。有关使用现代且完全支持的 Bokeh APIs 创建条形图的信息,请参阅其他回复。


以下是使用图表界面保留示例中标签原始顺序的方法,已使用 Bokeh 0.11.1 进行测试。

from bokeh.plotting import show
from bokeh.io import output_notebook
from bokeh.charts import Bar
from collections import OrderedDict
import calendar 
from bokeh.charts.attributes import CatAttr

output_notebook()

data = OrderedDict()
data['values'] = [2,3,4,5,6,7,8] #values only ascending to make correct graph clear
data['days'] = [calendar.day_name[i-1] for i in range(7)]
p = Bar(data, label=CatAttr(columns=['days'], sort=False), 
        values='values',title='OrderedDict Input',xlabel="Day", ylabel="Value")
show(p)

一般来说,对于任何绘图,您都应该能够明确指定 x(或 y)范围。 is helpful if you want to completely disregard the Bar chart class (which, for reasons mentioned, is not the worst idea in the world). 如果您的数据列已经按您希望的方式排序,则它会很有帮助。否则你可以自己指定顺序:

一周从星期日开始:

from bokeh.models import FactorRange
...
p.x_range = FactorRange(factors=data['days'])

一周从星期一开始:

p.x_range = FactorRange(factors=data['days'][1:] + [data['days'][0]])

这是与 user666 的回答相关的评论(我没有足够的学分来添加评论。)

我认为使用 OrderedDict 在这里没有帮助,因为它只记住插入键的顺序(即 'values' 在 'days' 之前),而不是序列的顺序这是与这些键关联的值。

此外,仅供参考,这里的散景 GitHub 站点上讨论了这个问题:https://github.com/bokeh/bokeh/issues/2924 and here: https://github.com/bokeh/bokeh/pull/3623