我使用的是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个值出现一次。如何到达那里的任何帮助将不胜感激。
答案 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,例如在热图中可以将内容定位在正确的位置,或者如果您根本没有数字数据,但仍然希望轴标签中有间隙。