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中!这是我的一个错误