散景– ColumnDataSource不更新晶须图

时间:2018-08-01 19:45:39

标签: python-3.x pandas bokeh

我在以下代码上遇到了问题(我切出了大块,但我可以将它们重新添加–这些看起来很重要)。在我的主代码中,我建立了一个绘图(“ sectionizePlot”),它是另一个晶须绘图(https://bokeh.pydata.org/en/latest/docs/user_guide/examples/plotting_whisker.html)的简单变体。我正在寻找动态更新。在同一脚本中,我使用的是热图(“ ModifiedGenericHeatMap”),该图可以正常更新。
有什么想法可以更新我的晶须图吗?更新ColumnDataSource似乎不起作用(这很有意义)。我想我在将每个圆/点分别添加到绘图上时遇到了问题。 一种想法是每次都清除图并手动将点添加到图中,但是每次都需要清除,我不确定该怎么做。
任何帮助,将不胜感激。我只是一个卑微的科学家,试图在医疗研究中利用Bokeh。

def ModifiedgenericHeatMap(source, maxPct):
    colors = ["#75968f", "#a5bab7", "#c9d9d3", "#e2e2e2", "#dfccce", "#ddb7b1", "#cc7878", "#933b41", "#550b1d"]
    #mapper = LinearColorMapper(palette=colors, low=0, high=data['count'].max())
    mapper = LinearColorMapper(palette=colors, low=0, high=maxPct)
    TOOLS = "hover,save,pan,box_zoom,reset,wheel_zoom"
    globalDist = figure(title="derp",
                        x_range=cols, y_range=list(reversed(rows)),
                        x_axis_location="above", plot_width=1000, plot_height=400,
                        tools=TOOLS, toolbar_location='below')
    globalDist.grid.grid_line_color = None
    globalDist.axis.axis_line_color = None
    globalDist.axis.major_tick_line_color = None
    globalDist.axis.major_label_text_font_size = "5pt"
    globalDist.axis.major_label_standoff = 0
    globalDist.xaxis.major_label_orientation = pi / 3
    globalDist.rect(x="cols", y="rows", width=1, height=1,
                    source=source,
                    fill_color={'field': 'count', 'transform': mapper},
                    line_color=None)
    color_bar = ColorBar(color_mapper=mapper, major_label_text_font_size="5pt",
                         ticker=BasicTicker(desired_num_ticks=len(colors)),
                         # fix this via using a formatter with accounts for
                         formatter=PrintfTickFormatter(format="%d%%"),
                         label_standoff=6, border_line_color=None, location=(0, 0))
    text_props = {"source": source, "text_align": "left", "text_baseline": "middle"}
    x = dodge("cols", -0.4, range=globalDist.x_range)
    r = globalDist.text(x=x, y=dodge("rows", 0.3, range=globalDist.y_range), text="count", **text_props)
    r.glyph.text_font_size = "8pt"
    globalDist.add_layout(color_bar, 'right')
    globalDist.select_one(HoverTool).tooltips = [
        ('Well:', '@rows @cols'),
        ('Count:', '@count'),
    ]
    return globalDist

def sectionizePlot(source, source_error, type, base):
    print("sectionize plot created with typ: " + type)
    colors = []
    for x in range(0, len(base)):
        colors.append(getRandomColor())
    title = type + "-wise Intensity Distribution"
    p = figure(plot_width=600, plot_height=300, title=title)
    p.add_layout(
        Whisker(source=source_error, base="base", upper="upper", lower="lower"))
    for i, sec in enumerate(source.data['base']):
        p.circle(x=source_error.data["base"][i], y=sec, color=colors[i])
    p.xaxis.axis_label = type
    p.yaxis.axis_label = "Intensity"
    if (type.split()[-1] == "Row"):
        print("hit a row")
        conv = dict(enumerate(list("nABCDEFGHIJKLMNOP")))
        conv.pop(0)
        p.xaxis.major_label_overrides = conv
    p.xaxis.ticker = SingleIntervalTicker(interval=1)
    return p

famData = dict()
e1FractSource = ColumnDataSource(dict(count=[], cols=[], rows=[], index=[]))
e1Fract = ModifiedgenericHeatMap(e1FractSource, 100)
rowSectTotSource = ColumnDataSource(data=dict(base=[]))
rowSectTotSource_error = ColumnDataSource(data=dict(base=[], lower=[], upper=[]))
rowSectPlot_tot = sectionizePlot(rowSectTotSource,rowSectTotSource_error, "eSum Row", rowBase)

def update(selected=None):
    global famData
    famData = getFAMData(file_source_dt1, True)
    global e1Stack
    e1Fract = (famData['e1Sub'] / famData['eSum']) * 100
    e1Stack = e1Fract.stack(dropna=False).reset_index()
    e1Stack.columns = ["rows", "cols", "count"]
    e1Stack['count'] = e1Stack['count'].apply(lambda x: round(x, 1))
    e1FractSource.data = dict(cols=e1Stack["cols"], count=(e1Stack["count"]),
                              rows=e1Stack["rows"], index=e1Stack.index.values, codon=wells, )

    rowData, colData = sectionize(famData['eSum'], rows, cols)
    rowData_lower, rowData_upper = getLowerUpper(rowData)
    rowBase = list(range(1, 17))
    rowSectTotSource_error.data = dict(base=rowBase, lower=rowData_lower, upper=rowData_upper, )
    rowSectTotSource.data = dict(base=rowData)
    rowSectPlot_tot.title.text = "plot changed in update"

layout = column(e1FractSource, rowSectPlot_tot)
update()

curdoc().add_root(layout)
curdoc().title = "Specs"
print("ok")

0 个答案:

没有答案