从 ColumnDataSource 列中提取最大值和最小值
Posted
技术标签:
【中文标题】从 ColumnDataSource 列中提取最大值和最小值【英文标题】:Extract the max and min values from a ColumnDataSource column 【发布时间】:2021-06-20 07:14:02 【问题描述】:我正在做一个 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']”中那样提取值
提前致谢!
【问题讨论】:
【参考方案1】:我想问题是,你的datos_heatmap.data['valoracion']
真的是一个空序列。请在此处使用minimal example 提供更多信息,并在将datos_heatmap.data['valoracion']
传递给LinearColorMapper
之前尝试打印您的datos_heatmap.data['valoracion']
。如果您使用 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)
这会产生以下情节:
【讨论】:
datos_heatmap.data['valoracion'] 来自 datos_calcular() 这是一个很大的函数,这就是我没有提出问题的原因。此外,我使用 datos_heatmap 作为线条字形的来源,因此它不是空序列。我认为问题在于 LinearColorMapper 没有“源”参数,所以我不能使用 ColumnDataSource 内容。 正如您在我的代码示例中看到的,也没有源参数。源仅用于计算该列的 min() 和 max() 值。因此,不需要处理源本身的参数。您只需将值传递给low
和high
。当您将print(min(datos_heatmap.data['valoracion']))
正好放在mapper = LinearColorMapper(palette=colors, low=min(datos_heatmap.data['valoracion']), high=max(datos_heatmap.data['valoracion']))
上方一行时,print()
的输出是什么?以上是关于从 ColumnDataSource 列中提取最大值和最小值的主要内容,如果未能解决你的问题,请参考以下文章