我正在努力使stacked bar plot example适应一些现有数据。
我的数据框架构造与示例中提供的类似。它可以作为CSV找到here。
这是我的代码:
from bokeh.charts import Bar, output_file, show
from bokeh.charts.attributes import cat, color
from bokeh.charts.operations import blend
bar = Bar(
df,
values=blend('farfetch','harrods', 'lyst', 'mrporter','nastygal','neimanmarcus','netaporter','theoutnet','yoox', name='retailers', labels_name='retailers'),
label=cat(columns='index', sort=False),
stack=cat(columns='retailers', sort=False),
tooltips=[('retailers', '@retailers'), ('brands', '@index')]
)
show(bar)
执行此代码后,我得到以下堆栈跟踪:
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-26-65462e21dce7> in <module>()
4 label=cat(columns=df['index'].tolist(), sort=False),
5 stack=cat(columns='retailers', sort=False),
----> 6 tooltips=[('retailers', '@retailers'), ('brands', '@index')]
7 )
/Users/lthibault/Python/antidox/buisint/analysis/venv/lib/python2.7/site-packages/bokeh/charts/builders/bar_builder.pyc in Bar(data, label, values, color, stack, group, agg, xscale, yscale, xgrid, ygrid, continuous_range, **kw)
318 kw['y_range'] = y_range
319
--> 320 chart = create_and_build(BarBuilder, data, **kw)
321
322 # hide x labels if there is a single value, implying stacking only
/Users/lthibault/Python/antidox/buisint/analysis/venv/lib/python2.7/site-packages/bokeh/charts/builder.pyc in create_and_build(builder_class, *data, **kws)
60 # create the new builder
61 builder_kws = {k: v for k, v in kws.items() if k in builder_props}
---> 62 builder = builder_class(*data, **builder_kws)
63
64 # create a chart to return, since there isn't one already
/Users/lthibault/Python/antidox/buisint/analysis/venv/lib/python2.7/site-packages/bokeh/charts/builder.pyc in __init__(self, *args, **kws)
280
281 # handle input attrs and ensure attrs have access to data
--> 282 attributes = self._setup_attrs(data, kws)
283
284 # remove inputs handled by dimensions and chart attributes
/Users/lthibault/Python/antidox/buisint/analysis/venv/lib/python2.7/site-packages/bokeh/charts/builder.pyc in _setup_attrs(self, data, kws)
308
309 """
--> 310 source = ColumnDataSource(data.df)
311 attr_names = self.default_attributes.keys()
312 custom_palette = kws.get('palette')
/Users/lthibault/Python/antidox/buisint/analysis/venv/lib/python2.7/site-packages/bokeh/models/sources.pyc in __init__(self, *args, **kw)
83 if not isinstance(raw_data, dict):
84 if pd and isinstance(raw_data, pd.DataFrame):
---> 85 raw_data = self._data_from_df(raw_data)
86 else:
87 raise ValueError("expected a dict or pandas.DataFrame, got %s" % raw_data)
/Users/lthibault/Python/antidox/buisint/analysis/venv/lib/python2.7/site-packages/bokeh/models/sources.pyc in _data_from_df(df)
105 new_data = {}
106 for colname in df:
--> 107 new_data[colname] = df[colname].tolist()
108 if index.name:
109 new_data[index.name] = index.tolist()
/Users/lthibault/Python/antidox/buisint/analysis/venv/lib/python2.7/site-packages/pandas/core/generic.pyc in __getattr__(self, name)
2667 if name in self._info_axis:
2668 return self[name]
-> 2669 return object.__getattribute__(self, name)
2670
2671 def __setattr__(self, name, value):
AttributeError: 'DataFrame' object has no attribute 'tolist'
为什么会这样?
答案 0 :(得分:1)
据我所知,这是name
的{{1}}和labels_name
参数相同时发生的错误。
在您的情况下,它们都是values
,因此您可能希望将标签更改为其他内容,例如retailers
。您还需要相应地更改堆栈和工具提示中的引用。