【问题标题】:How to manipulate legend in Incanter chart如何在 Incanter 图表中操作图例
【发布时间】:2012-03-14 05:59:46
【问题描述】:

我正在尝试在 Incanter 图表中包含一个图例,但在获取我想要的内容时遇到了一些麻烦:

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

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

  3. 因此,创建的图例包括创建空白图时使用的[][],它包括获取点数据时使用的函数调用,它包括名称损坏的匿名函数(fn*[p1__3813#](second p1__3813#))这对我的图表的消费者来说是非交流的。

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

这是我当前的代码;

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

因此,Incanter 图中有什么方法可以为每个 (add-lines ...)(add-points ...) 调用指定一个图例字符串?

非常感谢

迈克尔

【问题讨论】:

    标签: charts clojure legend incanter


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      要将漂亮的名称与一系列点或线相关联,请在将该数据添加到图表的命令中使用关键字: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,即xy 为空上面的序列,因为 Incanter 不允许您在不将数据传递给 scatter-plot 的情况下指定 :legend。如果 xy 为空(例如,它们是 nil),则空数据也会作为元素显示在图例中。我不相信这个问题目前可以直接解决(1.5.7版)。

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

      另一个笨拙的解决方案是这样的:

      (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)的颜色透明。否则,您的图例中会出现此数据集的红点。在红点和空字符串所属的图例中会有一个小的空白区域,但这比在那里看到一个红点更容易混淆。

      【讨论】:

        猜你喜欢
        • 2023-03-17
        • 2015-12-29
        • 1970-01-01
        • 1970-01-01
        • 2015-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多