본문 바로가기

엉터리 개발 이야기/Superset

[Superset] Horizontal Bar 추가.

반응형
case 'dist_bar_horizontal':
chart = nv.models.multiBarHorizontalChart()
.showControls(fd.show_controls)

if (!reduceXTicks) {
width = barchartWidth();
}
chart.width(width - 80);
console.log(width);
break;

nvd3_vis.js 에 추가


dist_bar_horizontal: {
label: t('Distribution - Horizontal Bar Chart'),
showOnExplore: true,
controlPanelSections: [
{
label: t('Query'),
expanded: true,
controlSetRows: [
['metrics'],
['groupby'],
['columns'],
['row_limit'],
['contribution'],
['stacked_metrics'],
],
},
{
label: t('Detail View Url'),
description: t('Use this section if you want to set detail view url'),
controlSetRows: [
['detail_view_url'],
['hide_series'],
],
},
{
label: t('Chart Options'),
expanded: true,
controlSetRows: [
['color_scheme'],
['show_legend', 'show_bar_value'],
['bar_stacked'],
['y_axis_format', 'bottom_margin'],
['x_axis_label', 'y_axis_label'],
['reduce_x_ticks', 'show_controls'],
],
},
],
controlOverrides: {
groupby: {
label: t('Series'),
},
columns: {
label: t('Breakdowns'),
description: t('Defines how each series is broken down'),
},
},
},

visTypes.js 에 추가


class DistributionHorizontalBarViz(DistributionPieViz):

"""A good old bar chart"""

viz_type = 'dist_bar_horizontal'
verbose_name = _('Distribution - Bar Chart')
is_timeseries = False

def query_obj(self):
d = super(DistributionHorizontalBarViz, self).query_obj() # noqa
fd = self.form_data
if (
len(d['groupby']) <
len(fd.get('groupby') or []) + len(fd.get('columns') or [])
):
raise Exception(
_("Can't have overlap between Series and Breakdowns"))
if not fd.get('metrics'):
raise Exception(_('Pick at least one metric'))
if not fd.get('groupby'):
raise Exception(_('Pick at least one field for [Series]'))
return d

def get_data(self, df):
fd = self.form_data

row = df.groupby(self.groupby).sum()[self.metrics[0]].copy()
row.sort_values(ascending=False, inplace=True)
columns = fd.get('columns') or []
pt = df.pivot_table(
index=self.groupby,
columns=columns,
values=self.metrics)
if fd.get('contribution'):
pt = pt.fillna(0)
pt = pt.T
pt = (pt / pt.sum()).T
pt = pt.reindex(row.index)
chart_data = []
for name, ys in pt.iteritems():
if pt[name].dtype.kind not in 'biufc' or name in self.groupby:
continue
if isinstance(name, string_types):
series_title = name
elif len(self.metrics) > 1:
series_title = ', '.join(name)
else:
l = [str(s) for s in name[1:]] # noqa: E741
series_title = ', '.join(l)
values = []
for i, v in ys.iteritems():
x = i
if isinstance(x, (tuple, list)):
x = ', '.join([text_type(s) for s in x])
else:
x = text_type(x)
values.append({
'x': x,
'y': v,
})
d = {
'key': series_title,
'values': values,
}
chart_data.append(d)
return chart_data

viz.py 에 추가


Vertical Bar 를 Horizontal로 변경


수정이 더 필요한 사항은

Y축에 나오는 Series 가 길 경우 width 조절이 필요함


반응형