대학원 일기

파이썬 시각화툴(Matplotlib) 본문

AI/인공지능 기초

파이썬 시각화툴(Matplotlib)

대학원생(노예) 2022. 2. 14. 18:19

matplotlib

matplotlib

가장 대중적으로 많이 쓰였고 많은 파이썬 라이브러리의 근간이 되는 matplotlib 이다. matplotlib는 다른 라이브러리들의 부모 라이브러리로서의 역할을 하고 있다고 표현할정도로 다른 라이브러리들에 많은 영향을 주었다. 다소 복잡한 라이브러리 구성으로 인해 최근에는 그 사용 빈도와 대중성이 떨어지고 있으나 여전히 많은 입문자들이 처음 사용해보게 되는 좋은 시각화 라이브러리이다.

  • matplotlib
  • pyplot
  • line
  • scatter
  • bar
  • histogram
  • boxplot
  • scatter matrix

 

matplotlib

- pyplot 객체를 사용하여 데이터를 표시

- Pyplot 객체에 그래프들을 쌓은 다음 show로 flush

import matplotlib.pyplot as plt

X = range(100)
Y = range(100)
plt.plot(X, Y)

- Graph는 원래 figure 객체에 생성됨

- pyplot 객체 사용시, 기본 figure에 그래프가 그려짐

import numpy as np 

X_1 = range(100)
Y_1 = [np.cos(value) for value in X]

X_2 = range(100)
Y_2 = [np.sin(value) for value in X]

plt.plot(X_1, Y_1)
plt.plot(X_2, Y_2)
plt.plot(range(100), range(100))
plt.show()

- subplot으로 여러개의 그림판을 만들 수 있다.

fig = plt.figure() # figure 반환
fig.set_size_inches(10,10) # 크기지정
ax_1 = fig.add_subplot(1,2,1) # 두개의 plot 생성
ax_2 = fig.add_subplot(1,2,2)  # 두개의 plot 생성

ax_1.plot(X_1, Y_1, c="b")  # 첫번째 plot
ax_2.plot(X_2, Y_2, c="g")  # 두번째 plot
plt.show() # show & flush

 

Set color

- Color 속성을 사용

- Float → 흑백, rgb color, predefined color 사용

X_1 = range(100)
Y_1 = [value for value in X]

X_2 = range(100)
Y_2 = [value + 100 for value in X]

plt.plot(X_1, Y_1, color="#000000")
plt.plot(X_2, Y_2, c="c")

plt.show()

 

Set linstyle

- ls 또는 linestyle 속성 사용

plt.plot(X_1, Y_1, c="b", linestyle="dashed")
plt.plot(X_2, Y_2, c="r", ls="dotted")

plt.show()

 

Set title

- Pyplot에 title함수 사용, figure의 subplot별 입력 가능

- Latex 타입의 표현도 가능 (수식 표현 가능)

plt.plot(X_1, Y_1, color="b", linestyle="dashed")
plt.plot(X_2, Y_2, color="r", linestyle="dotted")

plt.title("Two lines")
plt.show()

 

Set legend

- Legend 함수로 범례를 표시함, loc 위치등 속성 지정

plt.plot(X_1, Y_1, color="b", linestyle="dashed", label='line_1')
plt.plot(X_2, Y_2, color="r", linestyle="dotted", label='line_2')
plt.legend(shadow=True, fancybox=False, loc="upper right")

plt.title('$y = ax+b$')
plt.xlabel('$x_line$')
plt.ylabel('y_line')


plt.show()

 

Set grid & xylim

- Graph 보조선을 긋는 grid와 xy축 범위 한계를 지정

plt.plot(X_1, Y_1, color="b", linestyle="dashed", label='line_1')
plt.plot(X_2, Y_2, color="r", linestyle="dotted", label='line_2')
plt.legend(shadow=True, fancybox=True, loc="lower right")


plt.grid(True, lw=0.4, ls="--", c=".90")
plt.xlim(-1000, 2000)
plt.ylim(-1000, 2000)

plt.show()

Scatter

- scatter 함수 사용, marker: scatter 모양지정

data_1 = np.random.rand(512, 2)
data_2 = np.random.rand(512, 2)

plt.scatter(data_1[:,0], data_1[:,1], c="b", marker="x")
plt.scatter(data_2[:,0], data_2[:,1], c="r", marker="o")

plt.show()

- s: 데이터의 크기를 지정, 데이터의 크기비교가능

N = 50
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
area = np.pi * (15 * np.random.rand(N))**2 
plt.scatter(x, y, s=area, c=colors, alpha=0.5)
plt.show()

 

Bar chart

data = [[5., 25., 50., 20.],
        [4., 23., 51., 17],
        [6., 22., 52., 19]]

X = np.arange(0,8,2)

plt.bar(X + 0.00, data[0], color = 'b', width = 0.50)
plt.bar(X + 0.50, data[1], color = 'g', width = 0.50)
plt.bar(X + 1.0, data[2], color = 'r', width = 0.50)
plt.xticks(X+0.50, ("A","B","C", "D"))
plt.show()

data = np.array([[5., 25., 50., 20.],
        [4., 23., 51., 17],
        [6., 22., 52., 19]])

color_list = ['b', 'g', 'r']
data_label = ["A","B","C"]
X = np.arange(data.shape[1])

data = np.array([[5., 5., 5., 5.],
        [4., 23., 51., 17],
        [6., 22., 52., 19]])

for i in range(3):
    plt.bar(X, data[i], bottom = np.sum(data[:i], axis=0), 
            color = color_list[i], label=data_label[i])
plt.legend()
plt.show()

A = [5., 30., 45., 22.]
B = [5, 25, 50, 20]

X = range(4)

plt.bar(X, A, color = 'b')
plt.bar(X, B, color = 'r', bottom = 60)
plt.show()

women_pop = np.array([5, 30, 45, 22])
men_pop = np.array([5, 25, 50, 20])
X = np.arange(4)

plt.barh(X, women_pop, color = 'r')
plt.barh(X, -men_pop, color = 'b')
plt.show()

 

histogram

X = np.random.randn(1000)
plt.hist(X,bins=100)
plt.show()

 

boxplot

data = np.random.randn(100,5)
plt.boxplot(data)
plt.show()

Comments