“BokehUserWarning:ColumnDataSource的列必须具有相同的长度”

时间:2017-06-29 10:47:20

标签: python-3.x pandas bokeh

我试图绘制相当大量的数据,一直追溯到1998年。

我的代码似乎工作正常,但运行时会抛出错误消息“BokehUserWarning:ColumnDataSource的列必须具有相同的长度”

这是我的代码:

import pandas as pd
from bokeh.io import show, output_file, gridplot
from bokeh.plotting import figure

#Create dataframe
df = pd.read_csv('/Users/macbook/Desktop/source.tab', names=[
'#','datesent','total','place'] delimiter='\t', header=None, encoding="ISO-8859-1")

#Format date
df['datesent'] = pd.to_datetime(df['datesent'], dayfirst=True)

#Datamunging   
transactionssent = dict(pd.melt(df,value_vars=['datesent']).groupby('value').size())        
transactionssent_dataframe = pd.DataFrame.from_dict(transactionssent, orient= 'index')     
transactionssent_dataframe.columns = ['Number of sent transactions']                           
transactionssent_dataframe.index.rename('Date of sending', inplace= True)                         

#X- and Y-axis
x = pd.bdate_range('2017-1-1', '2200-1-1')
y = transactionssent_dataframe['Number of sent transactions']

#Bokeh object
ts = figure(x_axis_type="datetime")

#Show plot
ts.line(x, y)

output_file('/Users/macbook/Desktop/plot.html')

所有输出实际上都符合预期。错误是什么意思?我真的必须从数据框创建一个ColumndDataSource对象吗? 我认为将pandas数据帧直接传递给散景图功能是获取我想要的图形的好方法。是否有从熊猫日期框架创建散景图的最佳实践?

2 个答案:

答案 0 :(得分:4)

我认为验证错误来自xy系列的长度不同。如果有意义的话,输出可能会切断较长阵列的悬垂部分。

你没有“必须”手动创建一个ColumnDataSource(一个是在将数组传递给像line这样的字形方法时在内部创建的),但它有一些有助于防止这种情况的验证。

您可以通过以下方式直接从数据框创建ColumnDataSource:

source = ColumnDataSource(dataframe)
ts.line(x='x', y='y', source=source)

答案 1 :(得分:0)

此答案与问题不直接相关,但涉及相同的警告: 如果您在交互式绘图中更改ColumnDataSource的长度,则如果逐步更改它会收到相同的警告,例如您的数据来源是:

source = ColumnDataSource(
    data=dict(
        x=list(np.zeros(10)),
        y=list(np.ones(10)),
    )
)
p1 = plot.line(x='x', y='y', source=source, line_alpha=1, color="red")

,要更新的数据的长度为例如8.您可以这样做:

p1.data_source.data['x'] = list(np.zeros(8))
p1.data_source.data['y'] = list(np.ones(8))

将产生与上述相同的警告。 为避免警告,请使用dict设置值:

p1.data_source.data = {'x': list(np.zeros(8)),
                       'y': list(np.ones(8))}