改变散景网格线的位置

时间:2018-02-21 18:08:44

标签: python bokeh

我试图在图表上绘制几个点,类似于热图。

示例代码(改编自热图部分here):

import pandas as pd

from bokeh.io import output_notebook, show
from bokeh.models import BasicTicker, ColorBar, ColumnDataSource, LinearColorMapper, PrintfTickFormatter
from bokeh.plotting import figure
from bokeh.transform import transform
import numpy as np

# change this if you don't run it on a Jupyter Notebook
output_notebook()

testx = np.random.randint(0,10,10)
testy = np.random.randint(0,10,10)

npdata = np.stack((testx,testy), axis = 1)
hist, bins = np.histogramdd(npdata, normed = False, bins = (10,10), range=((0,10),(0,10)))

data = pd.DataFrame(hist, columns = [str(x) for x in range(10)])

data.columns.name = 'y'

data['x'] = [str(x) for x in range(10)]

data = data.set_index('x')

df = pd.DataFrame(data.stack(), columns=['present']).reset_index()

source = ColumnDataSource(df)


colors = ['lightblue', "yellow"]
mapper = LinearColorMapper(palette=colors, low=df.present.min(), high=df.present.max())

p = figure(plot_width=400, plot_height=400, title="test circle map",
           x_range=list(data.index), y_range=list((data.columns)),
           toolbar_location=None, tools="", x_axis_location="below")

p.circle(x="x", y="y", size=20, source=source,
       line_color=None, fill_color=transform('present', mapper))


p.axis.axis_line_color = None
p.axis.major_tick_line_color = None
p.axis.major_label_text_font_size = "10pt"
p.axis.major_label_standoff = 10
p.xaxis.major_label_orientation = 0

show(p)

返回:

test circle map

现在,正如您所看到的,网格线以点(圆圈)为中心,我希望将圆圈包围在由线条创建的正方形中。

我经历了this,看看我是否能找到有关如何将网格线偏移0.5的信息(可能会有效),但我无法做到。

1 个答案:

答案 0 :(得分:2)

Bokeh中没有任何内容可以实现这种类别的分类标记的偏移,但您可以编写自定义扩展来执行此操作:

CS_CODE = """
import {CategoricalTicker} from "models/tickers/categorical_ticker"

export class MyTicker extends CategoricalTicker
  type: "MyTicker"

  get_ticks: (start, end, range, cross_loc) ->
    ticks = super(start, end, range, cross_loc)

    # shift the default tick locations by half a categorical bin width
    ticks.major = ([x, 0.5] for x in ticks.major)

    return ticks

"""

class MyTicker(CategoricalTicker):
    __implementation__ = CS_CODE

p.xgrid.ticker = MyTicker()
p.ygrid.ticker = MyTicker()

请注意,当代码只是一个字符串时,Bokeh默认采用CoffeeScript,但也可以使用纯JS或TypeScript。将其添加到代码中会产生:

enter image description here

由于#6107 <,请注意关于output_notebook的评论您必须再次调用它(如果您之前已经调用它,可能会再次调用 之后的 / p>