視覚化の目的で Apache-superset でcountry_map
を使用しています。ポリゴンをズームインすると、次のように列の情報がポリゴンの内側に表示されます。
メトリック更新のコードは次のパスにあります:
superset/assets/src/visualizations/CountryMap/CountryMap.js
コード:
const updateMetrics = function (region) {
if (region.length > 0) {
resultText.text(format(region[0].metric));
}
};
メトリックは、controls.jsxで定義されています。
/superset/static/assets/src/explore/controls.jsx
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
を使用しているため、複数の指標を選択できません。コードは次のとおりです:
superset/assets/src/explore/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'],
],
},
],
python country_map
のクラス)は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'
ポリゴン内に表示するメトリックを追加するにはどうすればよいですか?
エラー_TypeError: unhashable type: 'list'
_の直接の原因は、ファイル "viz.py"の変更です:
query_obj(self)
メソッドの_self.form_data['metric']]
_から_self.form_data['metrics']]
_へ。
ソースコードで見ることができるように here 、フォームデータmetrics
はlist
を含むmetric
オブジェクトであり、ここでmetric
おそらく文字列またはその他のハッシュ可能なオブジェクトです。 python言語では、list
オブジェクトはハッシュ可能ではありません。ハッシュ可能なオブジェクト(metric
)をハッシュできないオブジェクト(metrics
)、次に_unhashable type
_エラーが発生します。
metrics
クエリを受け入れるようにCoutryMapViz.query_obj()
を変更する正しい方法は、他の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
_