           (.append "line"))
       (-> axis-container
           (.append "g")
-          (.attr "class" "y-axis axis")))))
+          (.attr "class" "y-axis positive axis"))
+      (-> axis-container
+          (.append "g")
+          (.attr "class" "y-axis negative axis")))))
 
 (defn chartable-builds [builds]
   (->> builds

                    "y" #(y-pos-scale (aget % "build_time_minutes"))
                    "x" #(x-scale (aget % "build_num"))
                    "width" (.rangeBand x-scale)
                    "height" #(- y-middle (y-pos-scale (aget % "build_time_minutes")))})
        (.select "title")
        (.text #(gstring/format "%s in %.1fm" (gstring/toTitleCase (aget % "outcome")) (aget % "build_time_minutes"))))

    ;; bottom bar enter and update
    (-> bars-join
        (.select ".bottom")
        (.attr #js {"y" y-middle
                    "x" #(x-scale (aget % "build_num"))
                    "width" (.rangeBand x-scale)
                    "height" #(- (y-neg-scale (aget % "queued_time_minutes")) y-middle)})
        (.select "title")
        (.text #(gstring/format "Queue time %.1fm" (aget % "queued_time_minutes"))))

    ;; bars exit
    (-> bars-join

   :legend-info {:square-size 10
                 :item-width 80
                 :item-height 14   ; assume font is 14px
                 :spacing 4}
   :positive-y% 0.65})

(defn add-queued-time [build]
  (let [queued-time (max (build/queued-time build) 0)]
