如何在Apache-superset中的country_map上添加更多指标?

问题描述 投票:19回答:1

我在country_map中使用用于可视化目的。放大多边形时,列中的信息会出现在多边形内部,如下所示:

map

只显示一个可用的度量标准选项:metric

可在此路径中找到度量标准更新的代码:

超/资产/ src目录/可视化/ CountryMap / CountryMap.js

码:

const updateMetrics = function (region) {
  if (region.length > 0) {     
    resultText.text(format(region[0].metric));
  }
};

度量标准在controls.jsx中定义:

/superset/static/assets/双人床/explore/controls.及时性

const metrics = {
  type: 'MetricsControl',
  multi: true,
  label: t('Metrics'),
  validators: [v.nonEmpty],
  default: (c) => {
    const metric = mainMetric(c.savedMetrics);
    return metric ? [metric] : null;
  },
  mapStateToProps: (state) => {
    const datasource = state.datasource;
    return {
      columns: datasource ? datasource.columns : [],
      savedMetrics: datasource ? datasource.metrics : [],
      datasourceType: datasource && datasource.type,
    };
  },
  description: t('One or many metrics to display'),
};
const metric = {
  ...metrics,
  multi: false,
  label: t('Metric'),
  default: props => mainMetric(props.savedMetrics),
};

国家地图使用的是metric,它不允许选择多个指标,代码可在此处找到:

超/资产/ src目录/浏览/ controlPanels / CountryMap.js

  controlPanelSections: [
    {
      label: t('Query'),
      expanded: true,
      controlSetRows: [
        ['entity'],
        ['metric'],
        ['adhoc_filters'],
      ],
    },
    {
      label: t('Options'),
      expanded: true,
      controlSetRows: [
        ['select_country', 'number_format'],
        ['linear_color_scheme'],
      ],
    },
  ],

country_map的python类位于viz.py:

class CountryMapViz(BaseViz):

    """A country centric"""

    viz_type = 'country_map'
    verbose_name = _('Country Map')
    is_timeseries = False
    credits = 'From bl.ocks.org By john-guerra'

    def query_obj(self):
        qry = super(CountryMapViz, self).query_obj()
        qry['metrics'] = [
            self.form_data['metric']]
        qry['groupby'] = [self.form_data['entity']]
        return qry

将CountryMap.js和viz.py中的代码从metric更改为metrics会导致以下错误:

Traceback (most recent call last):
  File "/Documents/superset/superset/superset/viz.py", line 410, in get_df_payload
    df = self.get_df(query_obj)
  File "/Documents/superset/superset/superset/viz.py", line 213, in get_df
    self.results = self.datasource.query(query_obj)
  File "/Documents/superset/superset/superset/connectors/sqla/models.py", line 797, in query
    sql = self.get_query_str(query_obj)
  File "/Documents/superset/superset/superset/connectors/sqla/models.py", line 471, in get_query_str
    qry = self.get_sqla_query(**query_obj)
  File "/Documents/superset/superset/superset/connectors/sqla/models.py", line 585, in get_sqla_query
    elif m in metrics_dict:
TypeError: unhashable type: 'list'

如何在多边形内部添加更多指标?

javascript python d3.js apache-superset
1个回答
1
投票

错误TypeError: unhashable type: 'list'的直接原因是您对文件“viz.py”的修改:

self.form_data['metric']]self.form_data['metrics']],用query_obj(self)方法。

正如您在源代码here中看到的,表单数据metrics是包含listmetric对象,其中metric可能是字符串或其他可哈希对象。在python语言中,list对象不可清除。因为用不可混合的对象(metric)替换可散列对象(metrics),然后会引发unhashable type错误。

修改CoutryMapViz.query_obj()以接受metrics查询的正确方法可以在其他Viz类中找到。代码部分here是一个非常好的例子:


class CalHeatmapViz(BaseViz):

"""Calendar heatmap."""
...

    def query_obj(self):
        d = super(CalHeatmapViz, self).query_obj()
        fd = self.form_data
        d['metrics'] = fd.get('metrics')
        return d

最后,CoutryMapViz.query_obj()方法应如下所示:

class CountryMapViz(BaseViz):

...

    def query_obj(self):
        qry = super(CountryMapViz, self).query_obj()
        qry['metrics'] = fd.get('metrics')
        qry['groupby'] = [self.form_data['entity']]
        return qry
© www.soinside.com 2019 - 2024. All rights reserved.