Как манипулировать легендой в чарте Incanter - PullRequest
4 голосов
/ 23 февраля 2012

Я пытаюсь включить легенду в диаграмму Инкантера, но у меня возникают проблемы с получением того, что я хочу:

  1. Я хочу иметь возможность сначала создать диаграмму без данных (используя [] [] в качестве моих аргументов x y), а затем добавить точки данных на отдельном шаге. Однако единственный способ добавить легенду - указать :legend true после того, как начальные x y точки заданы в конструкторе. Невозможно указать :legend true без аргументов x y, и я не нашел ни одной функции add-legend.

  2. Параметр легенды фиксирует код, который я использую при добавлении данных диаграммы, что означает, что если я не хочу, чтобы в легенде появлялся некрасивый код, я должен создать красивые переменные для точек 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 ...)?

Большое спасибо

Michael

Ответы [ 2 ]

2 голосов
/ 26 февраля 2012

Каждая диаграмма Incanter также является объектом JFreeChart.Таким образом, вы можете использовать любой из методов JFreeChart для управления вашей диаграммой Инкантера.

Например, чтобы удалить легенду, которую вы можете сделать (.removeLegend lux-ratios-plot).Существует также метод addLegend .Сам не пробовал.Надеюсь, это поможет.

0 голосов
/ 24 сентября 2016

Чтобы связать красивые имена с сериями точек или линий, используйте ключевое слово :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. Если x и y пустые (например, они 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) прозрачным. В противном случае у вас будет красная точка для этого набора данных в вашей легенде. В легенде у вас будет маленькое пустое место, к которому принадлежат красная точка и пустая строка, но это не так сложно, как увидеть красную точку там.

...