【问题标题】:Extract the max and min values from a ColumnDataSource column从 ColumnDataSource 列中提取最大值和最小值
【发布时间】: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']”中那样提取值

提前致谢!

【问题讨论】:

    标签: bokeh pandas-bokeh


    【解决方案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() 值。因此,不需要处理源本身的参数。您只需将值传递给lowhigh。当您将print(min(datos_heatmap.data['valoracion'])) 正好放在mapper = LinearColorMapper(palette=colors, low=min(datos_heatmap.data['valoracion']), high=max(datos_heatmap.data['valoracion'])) 上方一行时,print() 的输出是什么?
    猜你喜欢
    • 2013-04-09
    • 1970-01-01
    • 2019-04-04
    • 2019-11-22
    • 2014-10-17
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多