【问题标题】:Plotly not handling NA's well for Bar charts. Where shall I address that?Plotly 不能很好地处理条形图的 NA。我该在哪里解决这个问题?
【发布时间】: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?

【问题讨论】:

    标签: python plotly bar-chart holoviews


    【解决方案1】:

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

    1. holoviews 使用
    2. panel 调用
    3. bokeh 生成一个json
    4. 应该用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 的方式有关。
    猜你喜欢
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 2020-03-25
    • 2020-02-14
    相关资源
    最近更新 更多