提问人:leontalbot 提问时间:12/6/2016 最后编辑:leontalbot 更新时间:12/7/2016 访问量:147
在 Incanter 中为堆积条形图订购多列
Order multiple columns in Incanter for stacked bar chart
问:
我想对堆栈元素进行排序(group-by-k),同时保持全局柱(col-k)中的顺序。
$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赞
leontalbot
12/7/2016
#1
我们只能索引主键()上的计数,然后按索引和堆叠键()排序。col-k
group-by-k
因此,在函数中,我们可以将 d4 和 d5 替换为以下内容:sorted-barchart
(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)))
评论