오늘은 초4와 함께하는... 시리즈의 마지막 시간이다. 초4학년 1학기 막대그래프 단원이 전체의 1/6인데, 연습시간을 고려했을 때 약간 길어진 감이 있다.


어쨌든, 마지막 시간으로 지난번에 예기했던 자료의 순서를 제어하는 법에 대해 다룬다. 이번 시간 내용은 숙제로 내도 해결하는 친구가 있을 것 같다. 지난시간에 중요한 것을 해버렸기 때문이다. 우선, 뭐가 문제인지부터 알아보기로 하자. 파이썬에서 다음과 같은 코드를 작성하면


import numpy as np
import matplotlib.pyplot as plt
animals = ('cat', 'dog', 'rabbit', 'horse')
numbers = (1, 2, 3, 4)
plt.bar(animals, numbers)

다음과 같은 결과가 나온다.


rabbit과 horse의 순서가 바뀌어 있다. 이렇게 되는 이유는 plot을 위해서 자료들에 $x$좌표와 $y$좌표를 잡아줘야 하는데, 숫자가 아닌 문자 자료가 나오면 사전순으로 순서를 잡아서 그 순서를 따라 번호를 매겨주기 때문이다. 그래서 사전순으로 봤을 때 horse가 먼저 나오므로 작은 값을 horse가 가지게 되는 것이다. 그래서, 'cat', 'dog', 'rabbit', 'horse'가 각각 0, 1, 3, 2의 값을 가지게 되어 (0,1), (1,2), (3,3), (2,4)를 찍는 막대가 그려지는 것이다. 자료가 많을 때는 이렇게 했을 때 자료를 찾아내기 쉬워서 편해보일 수 있지만, 소규모 자료에서는 이것이 오히려 불편할 수도 있다. 그래서 원래 의도했던대로 그릴 수 있도록 코드를 수정해 보자.


animals가 문제니까, 우선은 숫자로 자료를 줘보기로 하자.


import numpy as np
import matplotlib.pyplot as plt
animals = np.arange(4)
numbers = (1, 2, 3, 4)
plt.bar(animals, numbers)


이제, 순서는 원래 입력한대로 되었다. 아래쪽이 숫자로 되어있는 것만 빼면... 그런데, 이것도 지난시간에 배웠다. xticks를 사용하면 된다.



import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
animals = np.arange(4)
numbers = (1, 2, 3, 4)
plt.bar(animals, numbers)
plt.xticks(animals, ('cat','dog','horse','rabbit'))
plt.show()


이제, 원하던 그림이 얻어지는 것을 알 수 있다. 조금만 더 생각하면 다음과 같이 간격이 다른 그림도 가능하다는 것을 알 수 있다.


이 모양과 같은 여러 변형된 형태를 과제로 준다면 초4가 그래프 개념을 잡는 데 큰 도움이 된다. 이것으로 이 스토리는 마친다. 막내가 커가면서 또 코딩 기회가 생기면 새로 시작하기로 한다.

+ Recent posts