본문 바로가기

Software/Python

Python에서 약간 재미있는 스타일로 plot 하기 XKCD 스타일

뭔가를 새롭게 배우고 익힌다는 것은 참 즐거운 일입니다. (비록 그게 아직 당장은 뭐 어디 쓸데는 없지만^^) 아무튼 뭐 그렇다는 거죠ㅠㅠ. 한참 응답하라1988에 푹 빠져있으면서, 또 주말에 출근해서 일도 하고... 그러면서... 또 뭔가 뜻대로 되는 것도 없는 이 묘한 교착상태가 아~주 답답하면서도 그런것들 속에서 살짝 이렇게 뭔가 즐겁게 배우고 익힐 수 있다는 것이 참 다행입니다.^^. 오늘은 요즘 Python 놀이 중에 발견한 재미있는 plot 스타일을 소개할려구요^^ XKCD 스타일 Sketch인데요. [바로가기]에 가보시면 예제 코드와 결과를 보실 수 있습니다.

import matplotlib.pyplot as plt
import numpy as np

with plt.xkcd():
    # Based on "Stove Ownership" from XKCD by Randall Monroe
    # http://xkcd.com/418/

    fig = plt.figure()
    ax = fig.add_axes((0.1, 0.2, 0.8, 0.7))
    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')
    plt.xticks([])
    plt.yticks([])
    ax.set_ylim([-30, 10])

    data = np.ones(100)
    data[70:] -= np.arange(30)

    plt.annotate(
        'THE DAY I REALIZED\nI COULD COOK BACON\nWHENEVER I WANTED',
        xy=(70, 1), arrowprops=dict(arrowstyle='->'), xytext=(15, -10))

    plt.plot(data)

    plt.xlabel('time')
    plt.ylabel('my overall health')
    fig.text(
        0.5, 0.05,
        '"Stove Ownership" from xkcd by Randall Monroe',
        ha='center')

    # Based on "The Data So Far" from XKCD by Randall Monroe
    # http://xkcd.com/373/

    fig = plt.figure()
    ax = fig.add_axes((0.1, 0.2, 0.8, 0.7))
    ax.bar([-0.125, 1.0 - 0.125], [0, 100], 0.25)
    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')
    ax.xaxis.set_ticks_position('bottom')
    ax.set_xticks([0, 1])
    ax.set_xlim([-0.5, 1.5])
    ax.set_ylim([0, 110])
    ax.set_xticklabels(['CONFIRMED BY\nEXPERIMENT', 'REFUTED BY\nEXPERIMENT'])
    plt.yticks([])

    plt.title("CLAIMS OF SUPERNATURAL POWERS")

    fig.text(
        0.5, 0.05,
        '"The Data So Far" from xkcd by Randall Monroe',
        ha='center')

plt.show()

사실 저 예제를 꼭 가져올 필요는 없었지만.. 그래도 그냥 가지고 블로그에 올립니다.ㅠㅠ. 아무튼 저걸 실행하면....

이런 결과가 나타납니다. 재미있죠.. annotate를 사용해서 뭔가 있어보이는 뭔가를 보여주네요^^

이런 결과를 보면 회사 업무용으로 분위기 전환겸 사용해도 괜찮지 않을까 생각할 정도인데요^^ 아주 예전에 Python에서 그래프를 그리는 예제로 헀던 것중 하나를 XKCD 스타일로 바꿔보죠... 그때 예제로 [바로가기]에 가면 Python으로 간편하게 그래프를 그려보기라는 예제가 있습니다. 이 예제의 코드가...

import re
import numpy as np
import matplotlib.pyplot as plt

t = []
y1 = []
y2 = []
y3 = []
y4 = []

data = open('plotData.txt')

for eachLine in data:
	readTmp = data.readline()
	tmp = [float(tmpLine) for tmpLine in re.split('\t', readTmp)]

	t.append(tmp[0])
	y1.append(tmp[1])
	y2.append(tmp[2])
	y3.append(tmp[3])
	y4.append(tmp[4])

data.close()

plt.plot(t, [i*180/np.pi for i in y1],
	t, [i*180/np.pi for i in y2],
	t, [i*180/np.pi for i in y3],
	t, [i*180/np.pi for i in y4])
plt.grid(True)
plt.xlabel('time')
plt.legend(('sin', 'cos', 'sin+cos', 'sin*cos'))
plt.axis([0, 10, -120, 120])
plt.show()

위와 같았는데요.. 거기서 plt.plot(...) 위에다가 plt.xkcd()만 넣어도 됩니다.^^

import re
import numpy as np
import matplotlib.pyplot as plt

t = []
y1 = []
y2 = []
y3 = []
y4 = []

data = open('plotData.txt')

for eachLine in data:
	readTmp = data.readline()
	tmp = [float(tmpLine) for tmpLine in re.split('\t', readTmp)]

	t.append(tmp[0])
	y1.append(tmp[1])
	y2.append(tmp[2])
	y3.append(tmp[3])
	y4.append(tmp[4])

data.close()

plt.xkcd()

plt.plot(t, [i*180/np.pi for i in y1],
	t, [i*180/np.pi for i in y2],
	t, [i*180/np.pi for i in y3],
	t, [i*180/np.pi for i in y4])
plt.grid(True)
plt.xlabel('time')
plt.legend(('sin', 'cos', 'sin+cos', 'sin*cos'))
plt.axis([0, 10, -120, 120])
plt.show()

위와 같이 말이죠... 그러면...

요렇게 짜잔~~~ 바뀝니다. ㅎㅎ^^ 뭐 오늘도 별거 아니지만.. 또 역시나 언제나 그렇듯 재미삼아 올리네요^^

반응형