Plotly 不能很好地处理条形图的 NA。我该在哪里解决这个问题?

Posted

技术标签:

【中文标题】Plotly 不能很好地处理条形图的 NA。我该在哪里解决这个问题?【英文标题】:Plotly not handling NA's well for Bar charts. Where shall I address that? 【发布时间】:2021-12-18 03:03:42 【问题描述】:

我想用 plotly 后端创建一个条形图。我使用aggregate-函数来计算每个类别中的项目数。让我举个例子。 首先我创建一些测试数据:

import holoviews as hv
hv.extension('plotly')
import numpy as np
import pandas as pd
samples = 100

pets = ['Cat', 'Dog', 'Hamster', 'Rabbit']
genders = ['Female', 'Male']

pets_sample = np.random.choice(pets, samples)
gender_sample = np.random.choice(genders, samples)
df=pd.DataFrame(data='pet':pets_sample,'gender':gender_sample,)
df['pet']=pd.Categorical(df['pet'])
df['gender']=pd.Categorical(df['gender'])
# Delete male hamsters so we have an empty category-combination
df=df[~((df['pet']=='Hamster') & (df['gender']=='Male'))]
df['name']=['Animal #'+str(i) for i in range(len(df))]
df=df[['name','pet','gender']]
df

当我尝试绘制这个时,使用

bars = hv.Bars(df, kdims=['pet', 'gender'],vdims='name').aggregate(function=np.count_nonzero)

bars.opts(width=1000,multi_level=False)

我收到以下错误:ValueError: Out of range float values are not JSON compliant

原因是(我认为)聚合表中有一个 NA:

hv.Table(df, kdims=['pet', 'gender'],vdims='name').aggregate(function=np.count_nonzero)

返回

您可以通过向数据框添加一个新列来解决此问题,该列仅包含一个并使用 np.sum 而不是 np.count_nonzero 然后一切正常:

df['ones']=1
bars=hv.Bars(df, kdims=['pet', 'gender'],vdims=[('ones','count')]).aggregate(function=np.sum)
bars.opts(width=1000,multi_level=False)

我认为在制作条形图时 NA 应该默认为零。如果我使用bokeh 作为后端,我的原始方法可以正常工作。 我想知道哪里是解决这个问题的好地方。 plotly的holoviews的github?

【问题讨论】:

【参考方案1】:

说实话,我查看了回溯,这似乎是bokeh 的问题,因为

    holoviews 使用 panel 调用 bokeh 生成一个json 应该用plotly渲染

在这个过程中,这条线在bokeh内部的某个地方被调用,

json.dumps(
    obj,
    cls=BokehJSONEncoder,
    allow_nan=False,
    indent=indent,
    separators=separators,
    sort_keys=True,
    **kwargs
)

其中allow_nan 设置为False

我引用bokehBokehJSONEncoder的文档

如果allow_nan 为真(默认),则 NaN、Infinity 和 -Infinity 将按此编码。此行为不符合 JSON 规范,但与大多数基于 javascript 的编码器和解码器一致。否则,对这些浮点数进行编码将是一个 ValueError。

因为这是pythonjson bulid-in使用的类。

不知道这个被禁用的原因,但是看起来是故意的,因为这个不能设置。

我认为因为很难获得关于这个主题和所有关系的概述,你应该在holoviz 论坛中解决你的问题。这似乎是所有专家都在的地方。

也可以是bokeh 论坛。

【讨论】:

是的,bokeh 或 holoviz 论坛都是个好主意;这属于他们之间的一个灰色地带。 Bokeh 开发人员很清楚这个问题,但它也可能与 Panel 使用 Bokeh 的方式有关。

以上是关于Plotly 不能很好地处理条形图的 NA。我该在哪里解决这个问题?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改使用 Plotly Express 创建的堆积条形图的文本方向?

Plotly:如何在将多个组作为条形图的同时显示和过滤具有多个下拉列表的数据框?

如何实现条形图的日期范围

用于图像分类的 Keras CNN 模型不能很好地泛化

Plotly Dash 图例中的自定义标记

分组条形图的子图分组图例