Bokeh跳过分类数据的刻度标签

时间:2018-01-25 07:12:45

标签: python bokeh

我使用的是Bokeh版本0.12.13。 我有一个混合的数字和分类数据。我在x轴上只有一个分类数据,其余的是数字。我将所有内容转换为分类数据来进行绘图(可能不是实现目标的最简单方法)。现在我的x轴刻度标签比我需要的密度更大。我想每隔10个值将它们分开,这样标签就是10,20,......,90,休息

这是我到目前为止所尝试的:

import pandas as pd
from bokeh.io import show
from bokeh.models import ColumnDataSource
from bokeh.plotting import figure
from bokeh.models.tickers import FixedTicker

# create mock data
n = [str(i) for i in np.arange(1,100)]
n.append('rest')
t = pd.DataFrame([n,list(np.random.randint(25,size=100))]).T
t.columns = ['Number','Value']
t.loc[t['Number']==100,'Number'] = 'Rest'

source = ColumnDataSource(t)

p = figure(plot_width=800, plot_height=400, title="",
            x_range=t['Number'].tolist(),toolbar_location=None, tools="")

p.vbar(x='Number', top='Value', width=1, source=source,
       line_color="white")

#p.xaxis.ticker = FixedTicker(ticks=[i for i in range(0,100,10)])

show(p)

理想情况下,我希望网格和x轴标签每隔10个值出现一次。如何到达那里的任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

更简单的方法是保留数值数据并使用xaxis.major_label_overrides。这是代码:

import pandas as pd
from bokeh.io import show
from bokeh.models import ColumnDataSource
from bokeh.plotting import figure
from bokeh.models.tickers import FixedTicker

# create mock data
n = np.arange(1,101)
t = pd.DataFrame([n,list(np.random.randint(25,size=100))]).T
t.columns = ['Number','Value']

source = ColumnDataSource(t)

p = figure(plot_width=800, plot_height=400, title="",
            toolbar_location=None, tools="")

p.vbar(x='Number', top='Value', width=1, source=source,
       line_color="white")

p.xaxis.major_label_overrides = {100: 'Rest'}

show(p)

答案 1 :(得分:0)

您现在可以使用FuncTickFormatter(在Bokeh 2.2.3中)执行此操作:

# This prints out only every 10th tick label
p.axis.formatter = FuncTickFormatter(code="""
    
    if (index % 10 == 0)
    {
        return tick;
    }
    else
    {
        return "";
    }
    """)

有时候,您可能希望这样做,而不是使用数字轴和major_label_overrides,例如在热图中可以将内容定位在正确的位置,或者如果您根本没有数字数据,但仍然希望轴标签中有间隙。