본문 바로가기
관/핫한 파이썬 공부

파이썬의 여러 모듈 공부하기 06.

by 4차원 박스 2019. 11. 6.

저번 포스팅에 이어서

그래프로 시각화하는 여러 방식을 살핀다

 

이번엔 그래프 뿐만 아니라, 만든 그래프를 파일로 저장하는 방법과

다른 tkinter모듈을 이용하여 창에 붙이는 방법도 알아본다.

 

 

 

 

히스토그램 그리기

256개 8비트로 표현할 수 있는 색상
gray 계열은 0이 검 256이 흰색이다


(참고로 2의8승-1은 2의7승 + 2의 6승 ...~2의0승 까지의 합 이다.)

이러한 gray이미지 3개가 모여서 rgb컬러를 만들게 된다.

히스토그램은 다음같이 만든다

x=np.random.randn(1000)
plt.hist(x,bins=20)

이것을 아래에있는 tk인터에 붙이는 방식으로도 가능하다.



tk인터에 그래프 붙이기(캔버스를 만들어서 그래플르 붙인다.)

gui의 일반적인 구성에서 가장큰것이 윈도우창 또는 프레임 이라하고
각종 위젯을 그 안에 만든다
여기서 그래프를 붙이려면 캔버스를 만들어서 여기에 붙이는 방식으로 
진행한다.


다음과 같다.

import tkinter as tk
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

fig=plt.figure()

data=np.random.rand(1024,2)
plt.scatter(data[:,0],data[:,1])

w=tk.Tk()
c=FigureCanvasTkAgg(fig,master=w)
c._tkcanvas.pack(side=tk.TOP,fill=tk.BOTH,expand=1)
w.mainloop()

파이썬 tk에서 여러개의 화면 띄우기
moduleA.py 등으로 저장하면 
이걸 나중에 import해서 깔끔하게 올릴수 있다.




여러 그래프 한 화면에 독립적으로 그리기
그리드를 사용하여 붙이되 subplot2gird 함수를 사용한다
그래프의 크기는 그리드 내에 rowspan과 colspan=1 등으로 크기를 정할수 있다.


fig,(g1,g2)=plt.subplots(nrows=2,ncols=1) #nrows는그래프의 개수로 생각한다.
x=np.random.randn(1000)
g1.hist(x,bins=20)

data=np.random.rand(1024,2)
g2.scatter(data[:,0],data[:,1])



w=tk.Tk()
c=FigureCanvasTkAgg(fig,master=w)
c._tkcanvas.pack()
w.mainloop()

이렇게 할수 있다.


산점도 여러개를 그릴때 색깔로 구분하기


A=np.random.standard_normal((100,2))
A+=np.array((-1,-1))

B=np.random.standard_normal((100,2))
B+=np.array((1,1))

plt.scatter(A[:,0],A[:,1],color='0.25')
plt.scatter(B[:,0],B[:,1],color='1',edgecolor='0')

plt.show()

이렇게 한다


머신러닝에 자주쓰이는 그래프

li=(b'Iris-setosa',b'Iris-versicolor',b'Iris-virginica')

def readli(label):
    return li.index(label)

data=np.loadtxt('iris.data.txt',delimiter=',',converters={4:readli})

colorset=('0','0.5','0.75')
colorli=[colorset[int(label)] for label in data[:,4]]

plt.scatter(data[:,0],data[:,1],color=colorli)
plt.show()

이 그래프를 아래의 이미지 추출하는 코드에서 적용해 본다.




그래프의 선모양 조절하는 법(linstyle 라인 스타일 ls를 사용)

def pdf(x,mu,sigma):
    a=1/(sigma*np.sqrt(2*np.pi))
    b=-1/(2*sigma**2)
    return a*np.exp(b*(x-mu)**x)

x=np.linspace(-6,6,1024)

plt.plot(x,pdf(x,0,1),color='k',linestyle='solid',linewidth=3.5)
plt.plot(x,pdf(x,0,5),color='k',ls='dashed',lw=5)
plt.plot(x,pdf(x,0,0.25),color='k',ls='dashdot',lw=5)


그래프 채우는 방법(hatch함수로 채운다.)

다음과 같다.
n=8
a=np.random.random(n)
b=np.random.random(n)

plt.bar(range(n),a,color='w', hatch='x', edgecolor='k') #hatch함수로 채운다.
plt.bar(range(n),a+b, bottom=a, color='w', hatch='/', edgecolor='k')
plt.show()


그래프 제목,레이블,텍스트 추가하기(엑셀과 유사하다 함)

n=8
a=np.random.random(n)
b=np.random.random(n)

plt.bar(range(n),a,color='w', hatch='x', edgecolor='k')
plt.bar(range(n),a+b, bottom=a, color='w', hatch='/', edgecolor='k')

plt.title('bar graph') #여기서부터 네이밍이다 핵심임
plt.xlabel('x coord=x')
plt.ylabel('y coord=y')
plt.text(4.5,1.0,'focus on')
plt.show()


그래프 눈금 간격 조정하기

x=np.linspace(-15,15,1024)
y=np.sinc(x)

ax=plt.axes()
ax.xaxis.set_major_locator(ticker.MultipleLocator(5)) #x축의 간격을 몇으로 할지 정한다(예로 이건 5씩 증가)
ax.xaxis.set_minor_locator(ticker.MultipleLocator(1)) #y축의 간격을 몇으로 할지 정한다(예로 이건 1씩 증가)
plt.plot(x,y,c='k')

plt.grid(True, which='both') #이게 있어야 눈금이 그려진다
plt.show()


그래프 축 범위 설정하기 (라인스페이스와 xlim 등을 이용한다)

x=np.linspace(-10,20,1024)
plt.xlim(-10,20)
plt.ylim(-0.5,1.5)
plt.plot(x,np.sinc(x), c='k')
plt.show()


그래프안의 그래프 추가

다음과 같이 한다.

x=np.linspace(-6,6,1024)
plt.plot(x,np.sinc(x),c='k')


a=plt.axes([0.6,0.6,0.25,0.25])
x=np.linspace(-3,3,1024)

a.plot(x,np.sinc(x),c='k')
plt.setp(a)
plt.show()


그래프를 이미지 파일로 저장하기

아나콘다의 그래프를 우클릭하는 방법도 있지만
코드로 저장하는 방법이 있다.
이 방법으로 투명한 그래프도 저장이 가능하다.(transparent=True)를 넣어서 가능

li=(b'Iris-setosa',b'Iris-versicolor',b'Iris-virginica')

def readli(label):
    return li.index(label)

data=np.loadtxt('iris.data.txt',delimiter=',',converters={4:readli})

colorset=('0','0.5','0.75')
colorli=[colorset[int(label)] for label in data[:,4]]

plt.scatter(data[:,0],data[:,1],color=colorli)
plt.savefig('machine_trans.png',transparent=True,dpi=300) #투명한 배경의 파일 만들기 + 해상도 300올리기
plt.savefig('machine_300.png',dpi=300) #해상도 300올리기
plt.show()

이걸로 하면 나온다

댓글