内容简介:为支持更多可视化图表,我司准备在seperset原始D3图表基础上,继续增加echarts可视化图表的类型,以供客户更直观的看到数据。这篇文章里将分为四个步骤,每个步骤紧密联系,缺一不可。我选择了堆叠条形图:bar-y-category-stack(这个英文名称就是对应顶部链接最后的名称,本文添加的图表的所有名称都叫bar-y-category-stack,因为添加的多了方便辨别区分)
为支持更多可视化图表,我司准备在seperset原始D3图表基础上,继续增加echarts可视化图表的类型,以供客户更直观的看到数据。这篇文章里将分为四个步骤,每个步骤紧密联系,缺一不可。
效果图:
目前已添加echarts图表。
最后通过查询,我们得到的实体数据通过添加的echarts图表已经显示。
步骤一:选择添加的echarts图,[charts官方实例] echarts.baidu.com/examples/
我选择了堆叠条形图:bar-y-category-stack(这个英文名称就是对应顶部链接最后的名称,本文添加的图表的所有名称都叫bar-y-category-stack,因为添加的多了方便辨别区分)
1.1 在visualizations文件夹下建立echarts_bar_y_category.js文件,这个文件是做echarts配置项。
import echarts from 'echarts';
function echartsAngularGaugeVis(slice, payload) {
const div = d3.select(slice.selector);
const sliceId = 'echarts_slice_' + slice.formData.slice_id;
const html = '<div id="main" style="width: ' + slice.width() + '' + 'px;height:' + slice.height() + 'px;">hahah</div>';
div.html(html); // reset
var myChart = echarts.init(document.getElementById('main'));
const params = payload.data;
console.log(params, 123);
var data_name = [];
var series = [];
var data_values = [];
var series_data = [];
params.forEach(function (item, index, array) {
data_name.push(item['key']);
item['values'].forEach(function (i, index, array) {
data_values.push(i['y']);
});
series_data = {
name:item['key'],
type: 'bar',
data: data_values
};
series.push(series_data)
});
var category_name = [];
params[0]['values'].forEach(function (item, index, array) {
category_name.push(item['x'])
});
const option = {
// title: {
// text: 'undefined - 无标题'
// },
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
}
},
legend: {
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: {
type: 'value',
boundaryGap: [0, 0.01]
},
yAxis: {
type: 'category',
data: category_name
},
series: series
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
}
module.exports = echartsAngularGaugeVis;
复制代码
1.2 保存图片(路径是\superset\static\assets\images\viz_thumbnails)
步骤二:添加文件。找到superset\static\assets\images\viz_thumbnails下的index.js
2.1 VIZ_TYPES这个对象里添加 echarts_bar_y_category: 'echarts_bar_y_category'
2.2 vizMap添加 [VIZ_TYPES.echarts_bar_y_category]: require('./echarts_bar_y_category.js'),
步骤三:查询条件配置。找到superset\static\assets\src\explore目录下的visTypes.js
echarts_bar_y_category: {
label: t('Echarts Bar Y Category'), // 表的名称
showOnExplore: true,
controlPanelSections: [ // 查询条件配置参数,每个图的参数都不一样
{
label: t('Query'),
expanded: true,
controlSetRows: [
['metrics'],
['groupby'],
['columns'],
['row_limit'],
['contribution'],
],
},
{
label: t('Chart Options'),
expanded: true,
controlSetRows: [
['color_scheme'],
['show_legend', 'show_bar_value'],
['bar_stacked', 'order_bars'],
['y_axis_format', 'y_axis_label'],
['show_controls', null],
],
},
{
label: t('X Axis'),
expanded: true,
controlSetRows: [
['x_axis_label', 'bottom_margin'],
['x_ticks_layout', 'reduce_x_ticks'],
],
},
],
controlOverrides: {
groupby: {
label: t('Series'),
},
columns: {
label: t('Breakdowns'),
description: t('Defines how each series is broken down'),
},
},
},
复制代码
步骤三:后端数据导出给前端的viz.py文件配置。
class Echarts_Bar_Y_Category(DistributionPieViz):
"""A good old bar chart"""
viz_type = 'echarts_bar_y_category'
verbose_name = _('Bar Y Category')
is_timeseries = False
def query_obj(self):
d = super(Echarts_Bar_Y_Category, 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.items():
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.items():
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
复制代码
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 数据可视化—Echarts图表应用
- 组件化可视化图表 - Recharts
- 组件化可视化图表 - Recharts
- 使用MongoDB图表对数据进行可视化
- 遇见大数据可视化 : 图表的视觉系统感知
- Python数据可视化之Pygal图表类型
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
文本上的算法——深入浅出自然语言处理
路彦雄 / 人民邮电出版社 / 2018-3-1 / 69.00元
本书结合作者多年学习和从事自然语言处理相关工作的经验,力图用生动形象的方式深入浅出地介绍自然语言处理的理论、方法和技术。本书抛弃掉繁琐的证明,提取出算法的核心,帮助读者尽快地掌握自然语言处理所必备的知识和技能。本书主要分两大部分。第一部分是理论篇,包含前3章内容,主要介绍一些基础的数学知识、优化理论知识和一些机器学习的相关知识。第二部分是应用篇,包含第4章到第8章,分别针对计算性能、文本处理的术语......一起来看看 《文本上的算法——深入浅出自然语言处理》 这本书的介绍吧!