Python 3.x 函数中返回的Bokeh绘图未呈现

Python 3.x 函数中返回的Bokeh绘图未呈现,python-3.x,jupyter-notebook,bokeh,Python 3.x,Jupyter Notebook,Bokeh,我写了一个函数来简化我的绘图,当我调用它时,它还没有给出任何错误 show(plt) 在返回值上,什么也没有发生。我在一本Jupyter笔记本上工作。我已经打电话给: output\u notebook() 以下是功能代码: def plot_dist(x, h, title, xl="X axis", yl="Y axis", categories=None, width=0.5, bottom=0, color="#DC143C", xmlo=None, ymlo=None, xlo=-18

我写了一个函数来简化我的绘图,当我调用它时,它还没有给出任何错误

show(plt)

在返回值上,什么也没有发生。我在一本Jupyter笔记本上工作。我已经打电话给:

output\u notebook()

以下是功能代码:

def plot_dist(x, h, title, xl="X axis", yl="Y axis", categories=None, width=0.5, bottom=0, color="#DC143C", xmlo=None, ymlo=None, xlo=-18, ylo=5):
    total = np.sum(h)
    source = ColumnDataSource(data={
        "x":x,
        "h":h,
        "percentages":[str(round((x*100)/total, 2)) + "%" for x in h]
    })
    plt = figure(
        title=title,
        x_axis_label=xl,
        y_axis_label=yl
    )
    plt.vbar(
        x="x",
        width=width,
        bottom=bottom,
        top="h",
        source=source,
        color=color
    )
    if xmlo is None:
        if categories is None:
            raise ValueError("If no categories are provided xaxis.major_label_overrides must be defined")
        plt.xaxis.major_label_overrides = {
            int(x):("(" + str(c.left) + "-" + str(c.right) + "]") for x,c in enumerate(categories)
        }
    else:
        plt.xaxis.major_label_overrides = xmlo

    if ymlo is None:
        plt.yaxis.major_label_overrides = { int(x):(str(int(x)/1000)+"k") for x in range(0, h.max(), math.ceil((h.max()/len(h))) )}
    else:
        plt.yaxis.major_label_overrides = ymlo

    labels = LabelSet(
        x=str(x), y=str(h), text="percentages", level="glyph",
        x_offset=xlo, y_offset=ylo, source=source, render_mode="canvas"
    )
    plt.add_layout(labels)

    return plt   
这就是它的调用方式:

X = [x for x in range(0, len(grps.index))]
H = grps.to_numpy()
plt = plot_dist(X, H, "Test", "xtest", "ytest", grps.index.categories)
X
只是一个列表,
grps
是调用pandas的
DataFrame.groupby

正如我所说,它没有给出任何错误,因此我认为问题在于
ColumnDataSource
对象,我一定是创建错误的对象。感谢您的帮助,谢谢

编辑1:删除以下行显然解决了问题:

plt.添加布局(标签)

情节现在呈现正确,但我需要添加标签,知道吗

编辑2:好的,我已经解决了问题,在运行代码时检查web控制台。以下错误显示:

错误:试图检索不存在字段的属性数组

问题出在以下几行:

    labels = LabelSet(
        x=str(x), y=str(h), text="percentages", level="glyph",
        x_offset=xlo, y_offset=ylo, source=source, render_mode="canvas"
    )

特别是在
x=str(x)
y=str(h)
中赋值。将其更改为简单的
x=“x”
,并
y=“h”
解决了它。

代码的问题在于标签声明:

labels = LabelSet(
    x=str(x), y=str(h), text="percentages", level="glyph",
    x_offset=xlo, y_offset=ylo, source=source, render_mode="canvas"
)   
它是通过检查浏览器的web控制台发现的,该控制台出现以下错误:

Error: attempted to retrieve property array for nonexistent field
参数
x
y
必须引用
ColumnDataSource
对象中的名称,该对象传递给用于绘制绘图的
Glyph
方法。
我错误地传递了
str(x)
str(y)
,它们是内容的字符串表示形式。我错误地认为它将引用变量的字符串表示形式。
要解决此问题,只需将
LabelSet
构造函数中使用的字典键作为值传递给
ColumnDataSource
构造函数的
x
y
参数即可:

labels = LabelSet(
    x="x", y="h", text="percentages", level="glyph",
    x_offset=xlo, y_offset=ylo, source=source, render_mode="canvas"
)   
此外,如果
ColumnDataSource
是由
数据框构建的,则字符串将是列名、字符串
“索引”
,如果绘图中使用的任何数据引用索引且没有显式名称,或者是索引对象的名称


非常感谢您帮助我解答这个问题。

代码的问题在于标签声明:

labels = LabelSet(
    x=str(x), y=str(h), text="percentages", level="glyph",
    x_offset=xlo, y_offset=ylo, source=source, render_mode="canvas"
)   
它是通过检查浏览器的web控制台发现的,该控制台出现以下错误:

Error: attempted to retrieve property array for nonexistent field
参数
x
y
必须引用
ColumnDataSource
对象中的名称,该对象传递给用于绘制绘图的
Glyph
方法。
我错误地传递了
str(x)
str(y)
,它们是内容的字符串表示形式。我错误地认为它将引用变量的字符串表示形式。
要解决此问题,只需将
LabelSet
构造函数中使用的字典键作为值传递给
ColumnDataSource
构造函数的
x
y
参数即可:

labels = LabelSet(
    x="x", y="h", text="percentages", level="glyph",
    x_offset=xlo, y_offset=ylo, source=source, render_mode="canvas"
)   
此外,如果
ColumnDataSource
是由
数据框构建的,则字符串将是列名、字符串
“索引”
,如果绘图中使用的任何数据引用索引且没有显式名称,或者是索引对象的名称


非常感谢您帮助我解答这个问题。

这是在经典笔记本中还是在Jupyter实验室中?如果是后者,您是否安装了所需的Jupyter实验室扩展?如果没有,什么版本的东西,什么操作系统,什么浏览器?
output\u notebook
是否显示成功加载的消息?我在一个经典的笔记本上,没有该功能,绘图工作正常,Ubuntu 18.04,Firefox 74 64位,是的,它会显示成功加载的消息message@bigreddot忘了给你贴标签什么bokeh版本?你能从repo(在适当的发布标签上)运行示例笔记本吗?@bigreddot我已经解决了这个问题,解决方案在edit2中!这是我的错在经典笔记本还是Jupyter实验室?如果是后者,您是否安装了所需的Jupyter实验室扩展?如果没有,什么版本的东西,什么操作系统,什么浏览器?
output\u notebook
是否显示成功加载的消息?我在一个经典的笔记本上,没有该功能,绘图工作正常,Ubuntu 18.04,Firefox 74 64位,是的,它会显示成功加载的消息message@bigreddot忘了给你贴标签什么bokeh版本?你能从repo(在适当的发布标签上)运行示例笔记本吗?@bigreddot我已经解决了这个问题,解决方案在edit2中!这是我的一个错误