2016-12-05 7 views
2

グローバルバー(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順序を保持するのが難しくなります。

答えて

1

メインキーのみ(col-k)のカウントをインデックスし、インデックスとスタックキー(group-by-k)でソートできます。

ので、sorted-barchart機能では、我々は次のようで、D4とD5を置き換えることができます。

(if 
    (and group-by-k order-k (not= order-k col-k)) 
    (let [d-count (core/$ col-k 
         (core/$order :c 
            :desc 
            (core/$rollup :count :c [col-k] d2))) 
     d-index (core/dataset [:index col-k] 
           (map-indexed vector d-count)) 
     d-join (core/$join [col-k col-k] d-index d3)] 
    (->> d-join 
     (core/$order (or order-group-k group-by-k) 
         (or order-group-sign :asc)) 
     (core/$order :index :asc))) 
    (let [d-new (if group-by-k 
       (core/$order (or order-group-k group-by-k) 
          (or order-group-sign :asc) d3) 
       d3)] 
    (core/$order (or order-k col-k) (or order-sign :desc) d-new))) 
関連する問題