2013-04-26 1 views
3

나는 사전 band1을 다음과 같이 가지고있다. 나는 사전의 각리스트의 첫 번째와 마지막 요소를 기반으로 그래프를 출력하고 싶다. x 축에있는 각 목록의 첫 번째 요소는 주파수이며 마지막 요소는 수신 강도이며 y 축에 있어야합니다. 예, 10812 내가이 정렬 아무런 문제가 없을파이썬의 Ascii 그래프

band1 = {'channel1': [10564, 2112.8, 1922.8, 0], 
     'channel10': [10787, 2157.4, 1967.4, 11], 
     'channel11': [10812, 2162.4, 1972.4, 16], 
     'channel12': [10837, 2167.4, 1977.4, 46], 
     'channel2': [10589, 2117.8, 1927.8, 29], 
     'channel3': [10612, 2122.4, 1932.4, 0], 
     'channel4': [10637, 2127.4, 1937.4, 40], 
     'channel5': [10662, 2132.4, 1942.4, 54], 
     'channel6': [10687, 2137.4, 1947.4, 0], 
     'channel7': [10712, 2142.4, 1952.4, 50], 
     'channel8': [10737, 2147.4, 1957.4, 19], 
     'channel9': [10762, 2152.4, 1962.4, 24]} 

(16) 등의 강도, 채널 1가 -> channel12을하지만, 꽤 그래프를 인쇄하는 멋진 방법과 다를 수 있습니다 사전에 항목의 금액은 무엇인가 더 많거나 적은 채널이 있습니다.

+1

당신이 [pyplot] 같은 그래프 라이브러리를 사용하여 생각 해 봤나 (http://matplotlib.org/api/pyplot_api.html)? pyplot을 사용하면 꽤 쉽습니다. –

+0

감사합니다. 거기에 어떤 라이브러리가 있는지보고 관심이 있습니다. 추가 정보를 다운로드하지 않고도 좋은 방법이 있습니다. 이것은 콘솔에 인쇄됩니다. pyplot을보고 환성을 느낄 것입니다. – Paul

+0

저는 ASCII 기반의 그래프 솔루션에 대해서는 잘 모르겠지만, 손으로 뭔가를 함께 넣을 수는 있습니다. 각 목록의 첫 번째 요소와 마지막 요소가 각각 x 축과 y 축인 경우 채널 이름을 어떻게 나타내겠습니까? 아니면 중요하지 않습니까? 결과 그래프가 어떻게 나타나야하는지에 대한 간단한 예제를 제공하면 도움이 될 것입니다. – Aya

답변

4

간단하고 순진한 포인트 다이어그램 알고리즘이 있습니다. 물론, 그 성능은 수행되는 것과는 거리가 멀고 최적화 될 수 있으며 출력에는 축과 숫자가있을 수 있습니다. 에

HEIGHT = 10 
WIDTH = 40 
MARKER = '*' 
FILL_CHARACTER = ' ' 

coords = [(ch[0], ch[3]) for ch in band1.values()] 


# Convert to coordinates of a desired ASCII area 

xmin = min(c[0] for c in coords) 
xmax = max(c[0] for c in coords) 
kx = (WIDTH - 1)/(xmax - xmin) 

ymin = min(c[1] for c in coords) 
ymax = max(c[1] for c in coords) 
ky = (HEIGHT - 1)/(ymax - ymin) 

acoords = [(round((c[0] - xmin) * kx), 
      round((c[1] - ymin) * ky)) for c in coords] 

# Actually draw the graph 

for y in range(HEIGHT, -1, -1): 
    chars = [] 
    for x in range(WIDTH): 
     if (x, y) in acoords: 
      chars.append(MARKER) 
     else: 
      chars.append(FILL_CHARACTER) 
    print(''.join(chars)) 

결과 :

   *       
        *     * 
      *        

    *         
          *   
         *   *  
           *  

*  *   *      

X 좌표는 독특한, 아주 쉽게 열이나 라인 다이어그램을 그릴 수정 될 수있는 경우.

예. 바의 경우에 대한 님의

HEIGHT = 10 
WIDTH = 40 
MARKER = '*' 
FILL_CHARACTER = ' ' 

coords = [(ch[0], ch[3]) for ch in band1.values()] 
coords.sort(key=lambda ch: ch[1]) 

xmin = min(c[0] for c in coords) 
xmax = max(c[0] for c in coords) 
kx = (WIDTH - 1)/(xmax - xmin) 

ymin = min(c[1] for c in coords) 
ymax = max(c[1] for c in coords) 
ky = (HEIGHT - 1)/(ymax - ymin) 

acoords = {} 
for c in coords: 
    x = round((c[0] - xmin) * kx) 
    y = round((c[1] - ymin) * ky) 
    if x not in acoords: 
     acoords[x] = y 
    else: 
     acoords[x] = max(acoords[x], y) 

for y in range(HEIGHT, -1, -1): 
    chars = [] 
    for x in range(WIDTH): 
     if acoords.get(x, 0) >= y: 
      chars.append(MARKER) 
     else: 
      chars.append(FILL_CHARACTER) 
    print(''.join(chars)) 

결과 :

   *       
       *  *     * 
      * *  *     * 
      * *  *     * 
    *  * *  *     * 
    *  * *  *  *   * 
    *  * *  * * *  * * 
    *  * *  * * * * * * 
    *  * *  * * * * * * 
**************************************** 
+0

감사합니다. – Paul

+0

@Paul 환영합니다! – Alexey