仅显示散景图例中的主要类别

时间:2017-11-27 12:07:38

标签: python bokeh

我希望散景图显示分类条形图数据的图例,但控制图例中显示的类别级别。

e.g。使用下面的散景示例代码,我希望传说只显示年份。所以“2015”,“2016”,“2017”,而不是目前的“苹果,2015”等。

此外,我试图隐藏x轴上显示的年份,因此它只显示结果。

我已经搜索了bokeh的文档一段时间,但看不到如何做到这一点。我想我需要在创建vbar时将legend属性设置为某种格式字符串,但我不知道允许哪种格式。这样做的正确方法是什么?

from bokeh.io import show, output_file
from bokeh.models import ColumnDataSource, FactorRange
from bokeh.plotting import figure
from bokeh.transform import factor_cmap

output_file("bars.html")

fruits = ['Apples', 'Pears', 'Nectarines', 'Plums', 'Grapes', 'Strawberries']
years = ['2015', '2016', '2017']

data = {'fruits' : fruits,
        '2015'   : [2, 1, 4, 3, 2, 4],
        '2016'   : [5, 3, 3, 2, 4, 6],
        '2017'   : [3, 2, 4, 4, 5, 3]}

# this creates [ ("Apples", "2015"), ("Apples", "2016"), ("Apples", "2017"), ("Pears", "2015), ... ]
x = [ (fruit, year) for fruit in fruits for year in years ]
counts = sum(zip(data['2015'], data['2016'], data['2017']), ()) # like an hstack

source = ColumnDataSource(data=dict(x=x, counts=counts))

p = figure(x_range=FactorRange(*x), plot_height=250, title="Fruit Counts by Year",
           toolbar_location=None, tools="")

palette = ["Red", "Green", "Blue"]
#p.vbar(x='x', top='counts', width=0.9, source=source)
p.vbar(x='x', top='counts', width=0.9, source=source, line_color="white",
       fill_color=factor_cmap('x', palette=palette, factors=years, start=1, end=2),
       # legend='x[0]'
       legend='x',
      )


p.y_range.start = 0
p.x_range.range_padding = 0.1
p.xaxis.major_label_orientation = 1
p.xgrid.grid_line_color = None
p.legend.location = "top_right"

show(p)

1 个答案:

答案 0 :(得分:0)

这里有一些快速代码可以动态构建图表。分别定义increment,然后从以上figure进行选择:

def incrementer(labels, base_inc=0.25):
    num_labels = len(labels)
    midpoint = num_labels / 2 if num_labels % 2 == 0 else num_labels / 2 - 0.5
    offset = base_inc * midpoint
    even_offset = base_inc / 2 if num_labels % 2 == 0 else 0

    return [i * base_inc - offset + even_offset for i in range(num_labels)]

..... 


from bokeh.palettes import Category20

palette = Category20[20]
increments = incrementer(regions, base_inc=0.125)
for i, region in enumerate(regions):
    p.vbar(
        x=dodge('x', increments[i], range=p.x_range), top=region, width=0.1, 
           source=source, color=palette[i], legend_label=region
        )