グローバルバー(col-k)で順序を保持しながらスタック要素(group-by-k)を並べ替える必要があります。Incanterで複数の列を積み上げ棒グラフとして注文する
$ order関数では、複数の列を一度に並べ替えることはできません。だから関数は2回ですが、最後のソートは前のソートを保持しません。ですから、グローバルバーをソートするか、バーの積み重ねた要素を並べ替えることができますが、両方をソートすることはできません!
どうすればこの問題を解決できますか?私は、$fn
の中でsorted-map
の作業が必要だと思われますが、これを実装する方法はわかりません。
ここでは、複数の注文を試みるために書いた関数です。
(require
(incanter '[core :as core]
'[charts :as charts])
(defn sorted-barchart [data col-k & {:keys [group-by-k
order-k
order-sign
order-group-k
order-group-sign
title
x-label
y-label
legend]}]
(core/with-data
(let [d (core/to-dataset data)
d1 (core/$where {group-by-k {:$fn #(not (empty? %))}} d)
d2 (core/$where {col-k {:$fn #(not (empty? %))}} d1)
d3 (core/$rollup :count :counts (if group-by-k [col-k group-by-k] [col-k]) d2)
d4 (core/$order (or order-k col-k) (or order-sign nil) d3)
d5 (core/$order (or order-group-k group-by-k)
(or order-group-sign nil) d4)]
d5)
(let [chart (charts/stacked-bar-chart col-k :counts
:group-by group-by-k
:vertical false
:x-label (or x-label " ")
:y-label (or y-label " ")
:title (or title " ")
:legend (or legend true)
:series-label "Total")]
chart)))
EDIT:これは実際にcol-kとgroup-by-kでソートするときに機能します。しかし、最初にソートする場合は、ソートされたスタック要素を取得したいときにソートするときにcol-k順序を保持するのが難しくなります。