Граф черепахи Python

Может ли кто-нибудь помочь мне очистить мой график. Когда я строю ось Y, я хочу, чтобы целые числа округлялись до ближайшей сотой. Кроме того, под каждым баром мне нужно пометить «a» - «z»: всего 26 баров:

def letterFreqPlot(freqList):    
    border = 5
    t = turtle.Turtle()
    t.pensize(3)
    screen = t.getscreen()
    maxheight = max(freqList)
    numbers = len(freqList)
    screen.setworldcoordinates(0-border,-.05,numbers+1,maxheight+.1)
    t.goto(0,0)
    t.hideturtle()
    t.speed(0)
    t.lt(90)
    t.fd(maxheight)
    t.fd(-maxheight)
    t.right(90)
    for item in freqList:
        t.fillcolor("blue")
        t.begin_fill()
        for dist in [1, item, 1, item]:           
            t.fd(dist)
            t.lt(90)
        t.fd(1)
        t.end_fill()
    t.goto(0,0)
    t.lt(90)
    for i in freqList:
        t.fd(i)
        t.lt(90)
        t.fd(3)
        t.write(float(i))
        t.fd(-3)
        t.rt(90)
        t.fd(-i)
    print('Click to exit')
    screen.exitonclick()
freqList = letterFreq(words)
letterFreqPlot(freqList)

список частот:

[0.09090909090909091, 0.0, 0.0, 0.09090909090909091, 0.18181818181818182, 0.0, 0.0, 0.0, 0.045454545454545456, 0.0, 0.0, 0.0, 0.0, 0.045454545454545456, 0.045454545454545456, 0.045454545454545456, 0.045454545454545456, 0.18181818181818182, 0.045454545454545456, 0.09090909090909091, 0.045454545454545456, 0.0, 0.045454545454545456, 0.0, 0.0, 0.0]


person MedaUser    schedule 02.12.2014    source источник
comment
Округление целых чисел до сотых неясно. Вы имели ввиду поплавки?   -  person Terry Jan Reedy    schedule 03.12.2014
comment
Я думаю, что ваш список частот должен быть необработанным. Если округлить 0,045 до 0,04 или 0,05, оно больше не будет равно половине 0,09, как сейчас. Если после прочтения документа вам нужна помощь с методом Turtle.write, просмотрите демонстрационные примеры, которые записывают текст, например, функцию tick() в демонстрации часов.   -  person Terry Jan Reedy    schedule 03.12.2014


Ответы (1)


Ниже моя попытка добавить функции, которые вы хотели, на график, а также немного оптимизировать код рисования и добавить функцию:

from turtle import Turtle, Screen

BORDER = 5
FONT = ("Arial", 12, "normal")
FLOAT_FORMAT = "0.2f"
PENSIZE = 3

def letterFrequency(string):
    counter = dict()

    length = ord('z') - ord('a') + 1

    for ordinal in range(length):
        counter[chr(ordinal + ord('a'))] = 0

    count = 0

    for character in string:
        if character.isalpha():
            counter[character] += 1
            count += 1

    return [counter[key] / count for key in sorted(counter)]


def letterFreqPlot(turtle, canvas, string):

    turtle.pensize(PENSIZE)

    frequencyList = letterFrequency(string)

    maxheight = max(frequencyList)
    numbers = len(frequencyList)

    canvas.setworldcoordinates(-BORDER, -.05, numbers + 1, maxheight + 0.1)

    turtle.hideturtle()

    for frequency in sorted(set(frequencyList)):
        turtle.penup()
        turtle.home()
        turtle.lt(90)
        turtle.pendown()
        turtle.forward(frequency)
        turtle.left(90)
        turtle.forward(3)
        turtle.write(format(frequency, FLOAT_FORMAT), font=FONT)

    turtle.penup()
    turtle.home()
    turtle.sety(-0.0125)

    for i, frequency in enumerate(frequencyList):
        turtle.forward(0.5)
        turtle.write(chr(ord('a') + i), font=FONT)
        turtle.forward(0.5)

    turtle.home()
    turtle.goto(len(frequencyList) / 2, -0.025)
    turtle.write(string, align="center", font=FONT)

    turtle.home()
    turtle.fillcolor("blue")
    turtle.pendown()

    for frequency in frequencyList:
        if frequency > 0.0:
            turtle.begin_fill()
            for distance in [1, frequency] * 2:
                turtle.forward(distance)
                turtle.left(90)
            turtle.end_fill()
        turtle.forward(1)


yertle = Turtle()
yertle.speed("fastest")

screen = Screen()

letterFreqPlot(yertle, screen, "an opportunity to teach is an opportunity to learn")

screen.exitonclick()

Вместо того, чтобы так много отступать от кода рисования, я использовал turtle.home() для сброса начальной точки и ориентации. Я также добавил простую эмуляцию вашего кода letterFrequency() для развлечения. Я собрал многие константы вместе, но есть еще кое-что, что нужно сделать в этом направлении.

введите здесь описание изображения

Кстати, у вас один из лучших примеров setworldcoordinates(), которые я видел.

person cdlane    schedule 09.11.2016