【发布时间】: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