如何在Incanter图表中操纵图例

时间:2012-02-23 19:16:35

标签: charts clojure legend incanter

我试图将一个传奇包含在一个Incanter图表中,但是我遇到了一些麻烦:

  1. 我希望能够首先实例化没有数据的图表(使用[] []作为我的x y参数),然后在单独的步骤中添加数据点。但是,添加图例的唯一方法是在构造函数中给出初始x y点后指定:legend true。没有x y参数,不能指定:legend true,我没有找到任何add-legend函数。

  2. 图例选项捕获我在添加图表数据时使用的代码,这意味着如果我不希望丑陋的代码出现在图例中,我必须为X和Y点创建漂亮的vars而不是仅仅调用函数。

  3. 因此,创建的图例包括创建空白图时使用的[][],它包括获取点数据时使用的函数调用,它包含名称错位的匿名函数{ {1}}这与我图表的消费者无法沟通。

  4. 我只是希望能够将字符串与图例中的每组点相关联,例如matlab,excel等。

  5. 这是我目前的代码;

    (fn*[p1__3813#](second p1__3813#))

    因此,在Incanter图表中是否有任何方法可以指定每个(def lux-ratios-plot (doto (scatter-plot [] [] :legend true :title "Lux/CH0 vs. CH1/CH0" :x-label "CH1/CH0" :y-label "Lux/CH0") (view))) (doseq [dut [incs hals cfls leds]] (add-points lux-ratios-plot (get-vals :CH1/CH0 dut) (get-vals :Lux/CH0 dut) :points true)) ; Show the trend line for each bulb (doseq [fit [inc-fit hal-fit cfl-fit led-fit]] (add-lines lux-ratios-plot (map #(second %) (:x fit)) (:fitted fit))) (add-lines ...)来电的图例字符串?

    非常感谢

    迈克尔

2 个答案:

答案 0 :(得分:2)

每个Incanter图表也是JFreeChart对象。因此,您可以使用任何JFreeChart方法来操纵您的Incanter图表。

例如,删除你可以做的图例(.removeLegend lux-ratios-plot)。还有addLegend方法。我自己没试过那个。希望这会有所帮助。

答案 1 :(得分:0)

要将好名称与一系列点或行相关联,请在将该数据添加到图表的命令中使用关键字:series-label。例如:

(def c (scatter plot x y :legend true))
(add-lines c x1 y1 :series-label "Primary")
(add-lines c x2 y2 :series-label "Secondary")

这并不能解决您问题中的其他问题:要创建包含图例的裸散点图,您必须将空数据传递到scatter-plot,即使用x并且y作为上面的空序列,因为Incanter不允许您指定:legend而不将数据传递给scatter-plot。如果xy为空(例如,它们为nil),则空数据也会显示为图例元素。我不相信这个问题可以直接克服(版本1.5.7)。

一种解决方案是在散点图调用中传递实际数据以及:series-label参数。但是,当数据集的数量事先未知时,这可能会使以编程方式生成散点图更加尴尬,因为您必须以不同于其他数据集的方式处理第一个数据集。

另一个,kludgey解决方案就是:

(def chart (scatter-plot nil nil :legend true :series-label ""))
(set-stroke-color chart (java.awt.Color. 0 0 0 0) :dataset 0)

使用空字符串作为:series-label的值意味着第一个空数据集的图例中的标签将不会显示。 set-stroke-color调用使空数据集(即数据集0)的颜色透明。否则,您的图例中的此数据集会有一个红点。在红色圆点和空白字符串所属的图例中你会有一个小的空白区域,但这比在那里看到一个红点更不容易。