0

我正在做一个 Bokeh 应用程序,其中有一个输入表,对其执行一些计算并生成一个新表。我正在尝试绘制这个新表的热图,所以我必须使用 LinearColorMapper 函数创建一个颜色条,但是我不能使用计算表(这是一个 ColumnDataSource)中的最小值和最大值,这就是该表存储:

def val_portafolio_mostrar():
  val_portafolio=datos_calcular()
  val_mapa=pd.DataFrame(val_portafolio.stack(), columns=['valoracion']).reset_index()
  datos_heatmap.data=dict(val_mapa)

将在热图上绘制的值位于 datos_heatmap 的“valoracion”列中,这是我用于 LinearColorMapper 的代码

colors = ["#75968f", "#a5bab7", "#c9d9d3", "#e2e2e2", "#dfccce", "#ddb7b1", "#cc7878", "#933b41", "#550b1d"]
mapper = LinearColorMapper(palette=colors, low=min(datos_heatmap.data['valoracion']), 
                            high=max(datos_heatmap.data['valoracion']))

但是我收到以下错误:

in mapper_fun
    mapper = LinearColorMapper(palette=colors, low=min(datos_heatmap.data['valoracion']),
ValueError: min() arg is an empty sequence

我认为这是因为为了访问 ColumnDataSource 值,该函数需要具有“source”参数,但是 LinearColorMapper 函数没有此参数,因此无法以这种方式解决它。我还尝试将最大值和最小值存储在另一个 ColumnDataSource 中,但我得到了同样的错误,因为我没有使用源,而只是像“datos_heatmap.data ['valoracion']”中那样提取值

提前致谢!

4

1 回答 1

0

我想问题是,你datos_heatmap.data['valoracion']真的是一个空序列。请在此处提供更多信息以及一个最小示例,并datos_heatmap.data['valoracion']在将其传递给LinearColorMapper. 如果您使用 python 函数,请确保您的定义在您希望它们存在的命名空间中是正确的。
检查以下示例,它的工作方式与您希望的方式相同:

import pandas as pd
from bokeh.plotting import figure, show
from bokeh.models import ColumnDataSource, LinearColorMapper
from bokeh.layouts import layout

plot1 = figure(plot_width=1000, plot_height=250)

df = pd.DataFrame({"ID":[0, 1, 2, 3], 
                   "Value1":[0, 100, 200, 300]})

source = ColumnDataSource(df)

cmap = LinearColorMapper(palette="Turbo256", low = min(source.data["Value1"]), high = max(source.data["Value1"]))

print(f"high value cmap: {cmap.high}")
print(f"low value cmap: {cmap.low}")

circle = plot1.circle(x='ID', y='Value1', source=source, size=30,
                      fill_color={"field":'Value1', "transform":cmap})

show(plot1)

这将产生以下图: 在此处输入图像描述

于 2021-03-24T14:45:33.037 回答