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
。
我引用bokeh
BokehJSONEncoder
的文档
如果
allow_nan
为真(默认),则 NaN、Infinity 和 -Infinity 将按此编码。此行为不符合 JSON 规范,但与大多数基于 javascript 的编码器和解码器一致。否则,对这些浮点数进行编码将是一个 ValueError。
因为这是pythonjson
bulid-in使用的类。
不知道这个被禁用的原因,但是看起来是故意的,因为这个不能设置。
我认为因为很难获得关于这个主题和所有关系的概述,你应该在holoviz
论坛中解决你的问题。这似乎是所有专家都在的地方。
也可以是bokeh
论坛。
【讨论】:
是的,bokeh 或 holoviz 论坛都是个好主意;这属于他们之间的一个灰色地带。 Bokeh 开发人员很清楚这个问题,但它也可能与 Panel 使用 Bokeh 的方式有关。以上是关于Plotly 不能很好地处理条形图的 NA。我该在哪里解决这个问题?的主要内容,如果未能解决你的问题,请参考以下文章
如何更改使用 Plotly Express 创建的堆积条形图的文本方向?