2016-12-05 55 views
2

我想在全局條(col-k)中保持順序的同時排序堆棧元素(group-by-k)。在Incanter中爲堆積條形圖排序多列

$ order函數不允許一次排列多個列。所以函數兩次,但最後一次不會保留以前的排序。所以我可以有全球酒吧排序,或者酒吧的堆疊元素,但不是兩個!

我該如何做到這一點?我懷疑我們需要一個sorted-map$fn內工作,但不知道如何實現這個...

這裏我寫的函數嘗試多次排序。

(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))) 

編輯:這實際上工作時,由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)))