Tex in matplotlib by 바죠

Tex in matplotlib

수식을 가장 잘 표현하는 방법은 Tex을 사용하는 것이다.
그림에서도 Tex을 사용한 수식을 사용할 수 있다면 금상첨화일것이다.

아래의 matplotlib예제를 보자.
그림에 Tex으로 작성된 수식이 함께 만들어진다는 사실에 주목하자.

"""
Demo of TeX rendering.

You can use TeX to render all of your matplotlib text if the rc
parameter text.usetex is set. This works currently on the agg and ps
backends, and requires that you have tex and the other dependencies
described at http://matplotlib.org/users/usetex.html
properly installed on your system. The first time you run a script
you will see a lot of output from tex and associated tools. The next
time, the run may be silent, as a lot of the information is cached in
~/.tex.cache

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


# Example data
t = np.arange(0.0, 1.0 + 0.01, 0.01)
s = np.cos(4 * np.pi * t) + 2

plt.rc('text', usetex=True)
plt.rc('font', family='serif')
plt.plot(t, s)

plt.xlabel(r'\textbf{time} (s)')
plt.ylabel(r'\textit{voltage} (mV)',fontsize=16)
plt.title(r"\TeX\ is Number "
          r"$\displaystyle\sum_{n=1}^\infty\frac{-e^{i\pi}}{2^n}$!",
          fontsize=16, color='gray')
# Make room for the ridiculously large title.
plt.subplots_adjust(top=0.8)

plt.savefig('tex_demo')
plt.show()





"""
A part of AMADEUS protocol
Written by In-Ho Lee, KRISS, July 14, 2018.
$python energyhistogram.py
"""
import matplotlib.mathtext as mathtext
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import matplotlib.path as path

fig, ax = plt.subplots()

iid=[]
volume=[]
energy=[]
kount=0
with open("csa.out", 'r') as afile:
     for line in afile:
         if(len(line.split()) == 11 and line.split()[3] == 'outcar'):
             iid.append(int(line.split()[0]))
             volume.append(float(line.split()[1]))
             energy.append(float(line.split()[2]))
             kount=kount+1
#print kount
plt.rc('text', usetex=True)
plt.rc('font', family='serif')

data=energy
# histogram our data with numpy

n, bins = np.histogram(data, 100)

# get the corners of the rectangles for the histogram
left = np.array(bins[:-1])
right = np.array(bins[1:])
bottom = np.zeros(len(left))
top = bottom + n

# we need a (numrects x numsides x 2) numpy array for the path helper
# function to build a compound path
XY = np.array([[left, left, right, right], [bottom, top, top, bottom]]).T

# get the Path object
barpath = path.Path.make_compound_path_from_polys(XY)

# make a patch out of it
patch = patches.PathPatch(barpath)
ax.add_patch(patch)

# update the view limits
ax.set_xlim(left[0], right[-1])
#ax.set_xlim(-175,-140)
ax.set_ylim(bottom.min(), top.max())

ax.set_xlabel('energy (eV)', fontsize=20)
plt.show()


"""
A part of AMADEUS protocol
Written by In-Ho Lee, KRISS, July 14, 2018.
$python volumehistogram.py
"""
import matplotlib.mathtext as mathtext
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import matplotlib.path as path

fig, ax = plt.subplots()

iid=[]
volume=[]
energy=[]
kount=0
with open("csa.out", 'r') as afile:
     for line in afile:
         if(len(line.split()) == 11 and line.split()[3] == 'outcar'):
             iid.append(int(line.split()[0]))
             volume.append(float(line.split()[1]))
             energy.append(float(line.split()[2]))
             kount=kount+1
#print kount
plt.rc('text', usetex=True)
plt.rc('font', family='serif')

data=volume
# histogram our data with numpy

n, bins = np.histogram(data, 100)

# get the corners of the rectangles for the histogram
left = np.array(bins[:-1])
right = np.array(bins[1:])
bottom = np.zeros(len(left))
top = bottom + n

# we need a (numrects x numsides x 2) numpy array for the path helper
# function to build a compound path
XY = np.array([[left, left, right, right], [bottom, top, top, bottom]]).T

# get the Path object
barpath = path.Path.make_compound_path_from_polys(XY)

# make a patch out of it
patch = patches.PathPatch(barpath)
ax.add_patch(patch)

# update the view limits
ax.set_xlim(left[0], right[-1])
#ax.set_xlim(500,1000)
ax.set_ylim(bottom.min(), top.max())

ax.set_xlabel('volume (\AA$^3$)', fontsize=20)
plt.show()


"""
A part of AMADEUS protocol
Written by In-Ho Lee, KRISS, July 14, 2018.
$python energyvolume.py
"""
import matplotlib.pyplot as plt
import matplotlib.mathtext as mathtext

iid=[]
volume=[]
energy=[]
kount=0
with open("csa.out", 'r') as afile:
     for line in afile:
         if(len(line.split()) == 11 and line.split()[3] == 'outcar'):
             iid.append(int(line.split()[0]))
             volume.append(float(line.split()[1]))
             energy.append(float(line.split()[2]))
             kount=kount+1

#print kount
plt.rc('text', usetex=True)
plt.rc('font', family='serif')
fig, ax = plt.subplots()
ax.plot(volume, energy, 'o', ms=5, lw=2, alpha=0.7, mfc='orange')
ax.grid()
#ax.set_xlim(500,1000)
#ax.set_ylim(-175,-150)
ax.set_xlabel('volume (\AA$^3$)', fontsize=20)
ax.set_ylabel('energy (eV)', fontsize=20)
plt.show()


"""
A part of AMADEUS protocol
Written by In-Ho Lee, KRISS, July 14, 2018.
$python energydensity.py
"""
import matplotlib.pyplot as plt
import matplotlib.mathtext as mathtext

iid=[]
energy=[]
density=[]
kount=0
with open("csa.out", 'r') as afile:
     for line in afile:
         if(len(line.split()) == 11 and line.split()[3] == 'outcar'):
             iid.append(int(line.split()[0]))
             energy.append(float(line.split()[2]))
             density.append(float(line.split()[10]))
             kount=kount+1

#print kount
plt.rc('text', usetex=True)
plt.rc('font', family='serif')
fig, ax = plt.subplots()
ax.plot(density, energy, 'o', ms=5, lw=2, alpha=0.7, mfc='orange')
ax.grid()
#ax.set_xlim(500,1000)
#ax.set_ylim(-175,-150)
ax.set_xlabel('density (g/cm$^3$)', fontsize=20)
ax.set_ylabel('energy (eV)', fontsize=20)
plt.show()


"""
A part of AMADEUS protocol
Written by In-Ho Lee, KRISS, July 14, 2018.
$python structureupdate.py
"""
import matplotlib.pyplot as plt
import matplotlib.mathtext as mathtext

oldiid=[]
newiid=[]
oldenergy=[]
newenergy=[]
kount=0
with open("csa.out", 'r') as afile:
     for line in afile:
         if(len(line.split()) == 6 and line.split()[1] == 'type,'):
             kount=kount+1
             if(line.split()[0] == 'old'):
                   oldiid.append(kount)
                   oldenergy.append(float(line.split()[3]))
             if(line.split()[0] == 'new'):
                   newiid.append(kount)
                   newenergy.append(float(line.split()[3]))

#print kount
plt.rc('text', usetex=True)
plt.rc('font', family='serif')
fig, ax = plt.subplots()
ax.plot(oldiid, oldenergy, 'o', ms=5, lw=2, alpha=0.7, mfc='orange')
ax.plot(newiid, newenergy, '*', ms=5, lw=2, alpha=0.7, mfc='blue')
ax.grid()
#ax.set_xlim(1,1000)
#ax.set_ylim(-175,-150)
ax.set_xlabel('structure update', fontsize=20)
ax.set_ylabel('energy (eV)', fontsize=20)
plt.show()

"""
import matplotlib.pyplot as plt
import matplotlib.mathtext as mathtext

oldiid=[]
newiid=[]
oldenergy=[]
newenergy=[]
oldenergybefore=[]
newenergybefore=[]
kount=0
with open("csa.out", 'r') as afile:
     for line in afile:
         if(len(line.split()) == 6 and line.split()[1] == 'type,'):
             kount=kount+1
             if(line.split()[0] == 'old'):
                   oldiid.append(kount)
                   oldenergy.append(float(line.split()[3]))
                   oldenergybefore.append(float(line.split()[4]))
             if(line.split()[0] == 'new'):
                   newiid.append(kount)
                   newenergy.append(float(line.split()[3]))
                   newenergybefore.append(float(line.split()[4]))
#print kount
plt.rc('text', usetex=True)
plt.rc('font', family='serif')
fig, ax = plt.subplots()
ax.plot(oldiid, oldenergybefore, 'x')
ax.plot(oldiid, oldenergy, 'o')
ax.plot(newiid, newenergybefore, '+')
ax.plot(newiid, newenergy, '*')
ax.grid()
#ax.set_xlim(1,1000)
# modify the y axis limits shown below.
ax.set_ylim(-175,-155)
ax.set_xlabel('structure update', fontsize=20)
ax.set_ylabel('energy (eV)', fontsize=20)
plt.show()





코스털리츠 교수 by 바죠

코스털리츠 교수



"한국의 기초과학 연구 잠재력이 높다고 생각합니다. 삼성, LG 등이 중심이 된 응용과학도 훌륭합니다. 다만 한국의 젊은 연구자들을 만나면서 이들이 경력과 미래에 대해 지나친 걱정을 한다는 것을 느꼈습니다. 자신이 하고 싶은 연구 자체를 즐기고, 심각하게 생각하지 않았으면 좋겠습니다."


"노벨상 수상은 95%가 운이었습니다. 적절한 시간·장소·사람(Right Place, Right Time, Right People)'이 있었기에 가능했습니다."


"연구를 즐기면서 새로운 것을 찾고자 도전했습니다. 인내력을 갖고 미지의 세계에 한발 한발 다가서는 것이 좋았습니다. 불확실성 속 연구에 도전하고, 결과를 주시했습니다."


"학구적인 세계에는 은퇴 연령이 없습니다. 물론 예전 젊었을 때처럼 활동적이지 못하고 천천히 연구를 수행할 수 밖에 없을 것입니다. 하지만 여전히 새로운 것을 생각하는 것이 즐겁습니다. 앞으로도 연구를 지속할 계획입니다."



matplotlib tutorial [Python] by 바죠

matplotlib tutorial

파이썬을 사용하는 중대한 이유중의 하나는 바로 그림 그리기이다. 단순히 그림 그리기를 넘어서 숨어있는 것이 있다.
그것은 바로 라이선스 구입 비용이다. 라이선스 구입 비용은 결단코 만만하지 않다. 크지도 않은 규모 직장을 생각해 보자. 적당한 규모의 단체라고 가정해도 쉽게 1억 정도는 각오해야만한다. 그것도 매년 지불해야만 하는 것이다. 이것은 명백한 고통이다. 어쩌면 파이썬을 배우기 전까지는 계속되는 고통일지도 모른다.

따라서, 현실적으로 모든 연구기관에서, 장기적으로 matplotlib 모듈을 이용한 그림 그리기는 매우 중요한 기술이 되어 버렸다.
파이썬 컴퓨터 언어를 배우는 것은 평생 발목을 잡을 수 있는 하나의 문제를 슬기롭게 해결하는 효과로 이어진다.


matplotlib를 활용한 예제들을 보자.

단순한 파이썬의 자료형 list를 이용한 그림 그리기
numpy를 이용한 그림 그리기
미리 준비된 파일로부터 데이터를 직접 읽어서 그림 그리기
linear vs log
log vs linear
log vs log
2x1, 2x2 판넬 그림 그리기
웹페이지 자료를 읽어서 그림 그리기  http://incredible.egloos.com/7415000
3차원 그림 그리기
애니메이션 [데이터 업데이트 방식]

재대로 된 많은 예제들은 아래의 URL에서 찾을 수 있다. 아주 다양한 그림들을 볼 수 있다.

예제 소스 코드를 마우스로 복사하여 vi 에디터에 붙여 넣기를 할 때 옵션 설정이 중요하다.
:set paste 
옵션을 활용해야 제대로 복사할 수 있다. copy-paste 를 정확히 수행하기 위한 옵션 설정이다. 

가장 핵심이 되는 것은 리스트 두 개를 선언하는 것이다. 이들을 이용하면 쉽게 xy plot을 만들 수 있다.
첫번째 리스트가 x값들이되고 두번째 리스트가 y값들이 된다.
응용하면 파일에서 데이터를 읽어들여서 두 개의 리스트를 채우는 것이 가능하다. 이렇게 리스트들을 만들 수 있으면 준비된 데이터를 그림으로 그릴 수 있다.

예제에 따라서는 numpy를 사용하고, array를 사용할 경우가 있다.
asarray()함수를 잘 사용하면 된다.

-------------------------------------------------------------------------------------------------------------------

import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.mathtext as mathtext
iid=[]
volume=[]
energy=[]
kount=0
with open("csa.out1", 'r') as afile:
     for line in afile:
         if(len(line.split()) == 11 and line.split()[3] == 'outcar'):
             iid.append(int(line.split()[0]))
             volume.append(float(line.split()[1]))
             energy.append(float(line.split()[2]))
             kount=kount+1

#print kount
plt.rc('text', usetex=True)
plt.rc('font', family='serif')
fig, ax = plt.subplots()
ax.plot(volume, energy, 'o', ms=5, lw=2, alpha=0.7, mfc='orange')
ax.grid()
ax.set_xlim(500,1000)
ax.set_ylim(-175,-150)
ax.set_xlabel('volume (\AA$^3$)', fontsize=20)
ax.set_ylabel('energy (eV)', fontsize=20)
plt.show()

-------------------------------------------------------------------------------------------------------------------

import numpy as np
import matplotlib.pyplot as plt
# Example data
t = np.arange(0.0, 1.0 + 0.01, 0.01)
s = np.cos(4 * np.pi * t) + 2

plt.rc('text', usetex=True)
plt.rc('font', family='serif')
plt.plot(t, s)

plt.xlabel(r'\textbf{time} (s)')
plt.ylabel(r'\textit{voltage} (mV)',fontsize=16)
plt.title(r"\TeX\ is Number "
          r"$\displaystyle\sum_{n=1}^\infty\frac{-e^{i\pi}}{2^n}$!",
          fontsize=16, color='gray')
# Make room for the ridiculously large title.
plt.subplots_adjust(top=0.8)

plt.savefig('tex_demo')
plt.show()

-------------------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------------------








------------------------------------------------------------------------------------------------------------------
Sentdex --> 저자
matplotlib tutorial 동영상 강의 시리즈:


------------------------------------------------------------------------------------------------------------------


"""
A simple example of an animated plot
"""
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig, ax = plt.subplots()

x = np.arange(0, 2*np.pi, 0.01)
line, = ax.plot(x, np.sin(x))


def animate(i):
    line.set_ydata(np.sin(x + i/10.0))  # update the data
    return line,


# Init only required for blitting to give a clean slate.
def init():
    line.set_ydata(np.ma.array(x, mask=True))
    return line,

ani = animation.FuncAnimation(fig, animate, np.arange(1, 200), init_func=init,
                              interval=25, blit=True)
plt.show()

------------------------------------------------------------------------------------------------------------------

데이터를 시간순으로 업데이트할 수 있다면, 그 데이터를 이용해서 애니메이션을 만들 수 있다.
example.txt 파일을 시간에 따라서 읽는다. 읽을 때마다 내용이 다르면 다른 그림이 그려진다.


------------------------------------------------------------------------------------------------------------------

3D plot 예제는 아래와 같이 간단하다.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D

X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)

fig = plt.figure()
ax = Axes3D(fig)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1)

plt.show()

------------------------------------------------------------------------------------------------------------------


from mpl_toolkits.mplot3d.axes3d import Axes3D
from matplotlib import cm
#from matplotlib.ticker import LinearLocator, FixedLocator, FormatStrFormatter
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()

ax = fig.add_subplot(1, 2, 1, projection='3d')
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet,
        linewidth=0, antialiased=False)
ax.set_zlim3d(-1.01, 1.01)

#ax.w_zaxis.set_major_locator(LinearLocator(10))
#ax.w_zaxis.set_major_formatter(FormatStrFormatter('%.03f'))

fig.colorbar(surf, shrink=0.5, aspect=5)

from mpl_toolkits.mplot3d.axes3d import get_test_data
ax = fig.add_subplot(1, 2, 2, projection='3d')
X, Y, Z = get_test_data(0.05)
ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10)

plt.show()

------------------------------------------------------------------------------------------------------------------


import matplotlib.pyplot as plt
import numpy as np

np.random.seed(19680801)
data = np.random.randn(2, 100)

fig, axs = plt.subplots(2, 2, figsize=(5, 5))
axs[0, 0].hist(data[0])
axs[1, 0].scatter(data[0], data[1])
axs[0, 1].plot(data[0], data[1])
axs[1, 1].hist2d(data[0], data[1])

plt.show()

------------------------------------------------------------------------------------------------------------------


import numpy as np
import matplotlib.pyplot as plt

# Data for plotting
t = np.arange(0.01, 20.0, 0.01)

# Create figure
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)

# log y axis
ax1.semilogy(t, np.exp(-t / 5.0))
ax1.set(title='semilogy')
ax1.grid()

# log x axis
ax2.semilogx(t, np.sin(2 * np.pi * t))
ax2.set(title='semilogx')
ax2.grid()

# log x and y axis
ax3.loglog(t, 20 * np.exp(-t / 10.0), basex=2)
ax3.set(title='loglog base 2 on x')
ax3.grid()

# With errorbars: clip non-positive values
# Use new data for plotting
x = 10.0**np.linspace(0.0, 2.0, 20)
y = x**2.0

ax4.set_xscale("log", nonposx='clip')
ax4.set_yscale("log", nonposy='clip')
ax4.set(title='Errorbars go negative')
ax4.errorbar(x, y, xerr=0.1 * x, yerr=5.0 + 0.75 * y)
# ylim must be set after errorbar to allow errorbar to autoscale limits
ax4.set_ylim(ymin=0.1)

fig.tight_layout()
plt.show()

------------------------------------------------------------------------------------------------------------------



두 가지 서로 다른 y 축 스케일을 사용할 경우:


import numpy as np
import matplotlib.pyplot as plt

# Create some mock data
t = np.arange(0.01, 10.0, 0.01)
data1 = np.exp(t)
data2 = np.sin(2 * np.pi * t)

fig, ax1 = plt.subplots()

color = 'red'
ax1.set_xlabel('time (s)')
ax1.set_ylabel('exp', color=color)
ax1.plot(t, data1, color=color)
ax1.tick_params(axis='y', labelcolor=color)

ax2 = ax1.twinx()  # instantiate a second axes that shares the same x-axis

color = 'blue'
ax2.set_ylabel('sin', color=color)  # we already handled the x-label with ax1
ax2.plot(t, data2, color=color)
ax2.tick_params(axis='y', labelcolor=color)

fig.tight_layout()  # otherwise the right y-label is slightly clipped
plt.show()

------------------------------------------------------------------------------------------------------------------

아래에 표시된 것들은 그림을 그릴 때 알아 두면 편리한 전문 용어들이다.
title
legend
major tick label
minor tick label
x axis label
y axis label
major tick
minor tick
grid
line
markers
spines

../../_images/anatomy.png



Web scraping [Python] by 바죠

웹상에 존재하는 데이터들이 많이 있다. 전공을 불문하고 매우 많은 자료들이 무료로 공급되는 것이 현실이다.
이들 자료를 자신의 컴퓨터로 가져와서 그림을 그리는 것을 상상할 수 있다. 
이러한 일들을 지원하는 파이썬 모듈이 있다.  아래의 예를 보자. 
https://en.wikipedia.org/wiki/Beautiful_Soup_(HTML_parser)



그림은 matplotlib를 활용하여 쉽게 그릴 수 있을 것이다.

-------------------------------------------------------------------------------------------------------------------


# print the first 500 characters of the HTML
print(r.text[0:500]) 


from bs4 import BeautifulSoup 
soup = BeautifulSoup(r.text, 'html.parser')


results = soup.find_all('span', attrs={'class':'short-desc'}) 

len(results) 

-------------------------------------------------------------------------------------------------------------------

import requests 
r = requests.get('https://www.nytimes.com/interactive/2017/06/23/opinion/trumps-lies.html')

from bs4 import BeautifulSoup 
soup = BeautifulSoup(r.text, 'html.parser') 
results = soup.find_all('span', attrs={'class':'short-desc'})

records = [] 
for result in results: 
    date = result.find('strong').text[0:-1] + ', 2017'
    lie = result.contents[1][1:-2]
    explanation = result.find('a').text[1:-1]
    url = result.find('a')['href']
    records.append((date, lie, explanation, url))

import pandas as pd 
df = pd.DataFrame(records, columns=['date', 'lie', 'explanation', 'url']) 
df['date'] = pd.to_datetime(df['date']) 
df.to_csv('trump_lies.csv', index=False, encoding='utf-8')

-------------------------------------------------------------------------------------------------------------------


>>> raw_html = simple_get('http://www.fabpedigree.com/james/mathmen.htm')
>>> html = BeautifulSoup(raw_html, 'html.parser')
>>> for i, li in enumerate(html.select('li')):
print(i, li.text)

0 Isaac Newton
Archimedes
Carl F. Gauss
Leonhard Euler
Bernhard Riemann

1 Archimedes
Carl F. Gauss
Leonhard Euler
Bernhard Riemann

2 Carl F. Gauss
Leonhard Euler
Bernhard Riemann

3 Leonhard Euler
Bernhard Riemann

4 Bernhard Riemann

# 5 ... and many more...

-------------------------------------------------------------------------------------------------------------------






1 2 3 4 5 6 7 8 9 10 다음

최근 포토로그