2017-01-08 13 views
1

Я сюжетные, используя следующий код показан на Using Racket to Plot Points:Заговор в Ракетка с именами, а не цифрами на оси х

(require plot) 
(define xs '(0 1 2 3 4 5)) 
(define ys '(0 1 4 9 16 25)) 
(plot (points (map vector xs ys) #:color 'red)) 

Но как я могу построить, где точки х-оси имеют имена, а не числа:

(define xs '(AA BB CC DD AA CC)) 

Попытка его выше код дает длинное сообщение об ошибке:

points: contract violation 
    expected: Real 
    given: 'AA 
    in: an element of 
     an element of 
     the 1st argument of 
     (->* 
     ((sequence/c (sequence/c Real))) 
     (#:alpha 
     Nonnegative-Real 
     #:color 
     (or/c 
     Integer 
     Symbol 
     String 
     (recursive-contract g2149 #:impersonator) 
     (cons/c 
      Real 
      (cons/c Real (cons/c Real())))) 
     #:fill-color 
     (or/c 
     Integer 
     Symbol 
     String 
     (recursive-contract g2149 #:impersonator) 
     (cons/c 
      Real 
      (cons/c Real (cons/c Real())))) 
     #:label 
     (or/C#f String) 
     #:line-width 
     Nonnegative-Real 
     #:size 
     Nonnegative-Real 
     #:sym 
     (or/c 
     Integer 
     Char 
     String 
     dot 
     point 
     pixel 
     plus 
     times 
     asterisk 
     5asterisk 
     odot 
     oplus 
     otimes 
     oasterisk 
     o5asterisk 
     circle 
     square 
     diamond 
     triangle 
     fullcircle 
     fullsquare 
     fulldiamond 
     fulltriangle 
     triangleup 
     triangledown 
     triangleleft 
     triangleright 
     fulltriangleup 
     fulltriangledown 
     fulltriangleleft 
     fulltriangleright 
     rightarrow 
     leftarrow 
     uparrow 
     downarrow 
     4star 
     5star 
     6star 
     7star 
     8star 
     full4star 
     full5star 
     full6star 
     full7star 
     full8star 
     circle1 
     circle2 
     circle3 
     circle4 
     circle5 
     circle6 
     circle7 
     circle8 
     bullet 
     fullcircle1 
     fullcircle2 
     fullcircle3 
     fullcircle4 
     fullcircle5 
     fullcircle6 
     fullcircle7 
     fullcircle8) 
     #:x-max 
     (or/c Real #f) 
     #:x-min 
     (or/c Real #f) 
     #:y-max 
     (or/c Real #f) 
     #:y-min 
     (or/c Real #f)) 
     any) 
    contract from: 
     <pkgs>/plot-lib/plot/private/plot2d/point.rkt 
    blaming: anonymous-module 
    (assuming the contract is correct) 
    at: <pkgs>/plot-lib/plot/private/plot2d/point.rkt:47.9 

Ho w могу ли я сделать график, где ось х имеет имена групп, а не числа?

ответ

3

Возможно, вы делаете одну из двух вещей. Прежде всего я предполагаю, что вы рисуете какую-то гистограмму; т. е. ваш XS представляет собой отдельные категории. В этом случае вы, вероятно, захотите использовать, например, discrete-histogram. В этом случае вы должны написать

#lang racket 
(require plot) 
(define xs '(AA BB CC DD AA CC)) 
(define ys '(0 1 4 9 16 25)) 
(plot (discrete-histogram (map vector xs ys) #:color 'red)) 

Если это не то, что вы имели в виду, сообщите нам об этом.

EDIT: для обсуждения ниже, как вы можете обновлять метки меток для определенных значений.

#lang racket 

(require plot) 

(define current-layout 
    (ticks-layout (plot-x-ticks))) 
(define current-formatter 
    (ticks-format (plot-x-ticks))) 

(define my-label-hash 
    (hash 1 "AA" 
     2 "BB")) 

(parameterize 
    ([plot-x-ticks 
     (ticks (ticks-layout (plot-x-ticks)) 
      (λ (min max pre-ticks) 
       (define default-layed-out 
       (current-formatter min max pre-ticks)) 
       (for/list ([pt (in-list pre-ticks)] 
          [default (in-list default-layed-out)]) 
       (or (hash-ref my-label-hash (pre-tick-value pt) #f) 
        default))))]) 
    (plot (function (λ (x) x)) 
     #:x-min 0 
     #:x-max 4)) 
+0

Да, я пытался создать только гистограмму. Благодарю. – rnso

+0

Но 2 AA и 2 CC точки строятся как отдельные столбцы здесь. Как я могу построить их как точки, а не гистограммы, и 2 точки AA и CC над их соответствующей одной осью оси x. Кроме того, будет интересно, если бы вы могли упомянуть, что было вторым, что вы имели в виду для этой ситуации. – rnso

+0

Хм ... Я вижу, что вы хотите присоединиться к результатам AA и результатам CC, но я не уверен, что вы хотите, чтобы получившийся граф выглядел. Возможно, вы просто хотите видеть AA, BB и CC по оси X и одну или несколько точек над каждой меткой. В этом случае вы должны взглянуть на способность указывать пользовательские тики с помощью «plot-x-ticks» и приведенный здесь пример. В этом случае вы, вероятно, свяжете каждую метку с конкретным значением x, затем соберите точки по значению x, а затем пометьте их как хотите. –