2014-12-02 81 views
1

任何人都可以幫我清理我的圖。當我繪製y-xis時,我想要整數四捨五入到最接近的百分之一。此外,每個杆下我需要標記 'A' - 'Z':26巴總:Python龜圖

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) 

爲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]

+0

將整數舍入到最接近的百分數不清楚。你的意思是花車嗎? – 2014-12-03 04:32:16

+0

我認爲你的頻率列表應該是原始計數。如果你將.045加到.04或.05中,它將不再是.09的一半,就像現在一樣。如果讀完文檔後需要使用turtle.write方法,請查看寫入文本的turtledemo示例,例如時鐘演示中的tick()函數。 – 2014-12-03 04:48:54

回答

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()代碼的樂趣。我將許多常量聚集在一起,但還有更多要做的事。

enter image description here

順便說一句,你是我見過的setworldcoordinates()一個最好的例子。