1. matplotlib

1) 그래프 그리기

1
2
3
4
5
6
7
import matplotlib.pyplot as plt

fig1 = plt.figure(figsize=(w, h))
ax1 = fig1.add_axes([l, b, w, h])
fig1.axes[0].plot(list1, list2, label="func1") 
plt.legend() 
plt.show()

- plt.figure() 함수를 호출하면 빈 figure 객체를 생성할 수 있다. figure 객체는 이후 add_axes(), plot() 함수 등을 사용하여 좌표평면에 축과 그래프를 그릴 경우 이를 담게 될 일종의 container이며, 객체 자체로서는 axes 객체를 안에 담을 수 있다는 기능이 있다. 생성 당시에는 아무 axes 객체도 담고 있지 않다.

  • figsize: 이를 지정하여 인자로 전달할 경우, 화면에 그리게 될 전체 평면의 크기가 그 인자대로 표현된다.

  • set_size_inches(): figure 객체에 대하여 호출할 수 있는 메서드로, figsize와 마찬가지로 화면에 그리게 될 전체 평면의 크기를 지정하는 메서드이다.

- axes 객체는 figure 객체 안에 담기는 객체로서, 좌표평면의 x축, y축 쌍을 표현하는 객체이다. figure 객체 안에 담은 후 plt.show() 함수로 이를 표현하도록 하면 그 axes 객체로 표현되는 축이 그려진 좌표평면을 그리게 된다. figure 객체 안에 axes 객체는 하나뿐 아니라 둘 이상이 담길 수도 있다. 이 경우 전체 평면 위에 각 x, y축이 각 axes 객체가 그 객체 생성 당시 지정된 위치에 표현되게 된다.

- figure() 객체를 생성한 후 axes() 메서드를 호출하면 새로운 axes 객체를 생성하여 이를 그 figure 객체에 담게 된다. (이때 4개의 숫자로 이루어진 list를 인자로 전달해야 한다.) 이렇게 생성된 axes 객체는 그 figure() 객체의 axes라는 이름의 멤버 list에 담기게 되며, 새로운 변수에 저장할 수도 있다.

  • l, b: x축, y축을 그릴 상대적 위치를 뜻한다. figure 객체 안에 axes 객체가 하나만 있다면 별 의미를 가지지 않으나, 둘 이상 담는다면 각 axes 객체의 x축, y축 위치가 상대적 값으로 계산되어 그려지게 된다.

  • w, h: 그 axes 객체로 표현할 좌표평면의 가로세로 크기를 뜻한다. 이 역시 상대적 값으로 정의된다.

- axes 객체의 메서드로서 plot(), scatter()를 호출하면 인자로 전달된 두 리스트의 각 값을 x 좌표, y 좌표로 하는 꺾은선 그래프, 분산 그래프를 그릴 수 있다.

  • plot(): 인자로 전달된 점들 사이를 직선으로 잇는 꺾은선 그래프를 그린다. matplotlib에서 공식적으로 곡선을 그릴 수 있는 방법은 지원되지 않으나, numpy.arange()로 간격이 1보다 작은 실수들이 연속해서 담겨 리턴된 array를 plot()의 인자로 전달하면 곡선에 가까운 그래프 개형을 얻을 수 있다.

  • scatter(): 단순히 인자로 전달된 점들을 그대로 좌표평면에 찍기만 한다.

- 그래프를 그리는 함수에 인자로 label을 지정하여 전달하면 그 함수로써 그려지는 그래프의 이름을 지정할 수 있다. 이 경우 이렇게 지정된 이름은 범례를 표시하게 하는 함수(legend())를 호출해야 그 이름이 그래프와 함께 표시된다.

  • plot()함수에 label을 지정하지 않았다면, legend() 함수를 호출하면서 인자로 각 그래프의 이름을 리스트에 담아서 전달해도 같은 기능을 수행한다.
1
plt.plot(list1, list2)

- 여태 본 것과 같이 figure 객체나 axes 객체를 직접 생성하지 않더라도, matplotlib.pyplot의 plot(), scatter() 함수를 직접 호출하면 스스로 빈 figure 객체에 적절한 axes 객체를 추가한 후 그 위에 꺾은선 그래프, 분산 그래프를 그린다. (figure 객체가 생성된 뒤에 호출될 경우, 가장 최근 생성된 figure 객체 안에 그래프를 그린다.)

2) 가장 최근 생성된 figure 객체의 가장 왼쪽 위 axes 객체만 조작하기

(1) 좌표평면, 축에 이름 붙이기

1
2
3
plt.title("제목")
plt.xlabel("x축")
plt.ylabel("y축")

(2) 그려지는 x축, y축의 범위 지정하기

1
plt.axis([x_min, x_max, y_min, y_max])

(3) 축에 표시되는 숫자 지정하기

1
2
plt.xticks(list1)
plt.yticks(list2)

2. matplotlib와 seaborn이 지원하는 여러 그래프들

1
2
3
plt.bar(x, y) #각 x에 대응되는 y의 값을 막대그래프로 그린다.
plt.pie([40, 40, 3, 3], label=['이', '윤', '심', '안']) 
plt.boxplot((a1, a2)) 

- pie(): 인자로 전달된 list의 각 원소 크기가 그 원소가 원형 그래프에서 차지하는 크기가 되는 원형 그래프를 그린다. label로 지정된 list의 각 원소가 인자로 전달된 list의 각 원소가 갖는 이름이 된다.

- boxplot(): 인자로 전달된 값들(list형)의 최댓값, 최솟값, 중간값, 1/4값, 3/4값에 관한 정보를 하나의 box 모양 그래프에 담아 그린다. 인자로 받는 튜플의 크기는 하나 이상일 수 있으며, 인자로 받은 튜플의 각 성분 list에 대응되는 박스가 x축을 따라 하나씩 순서대로 그려진다.

1
2
3
4
5
6
7
import seaborn as sns

plt.hist(list1, bins=list2)
sns.kdeplot(x=s1, shade=True, ax=ax1) 

d3 = pd.read_csv("dataframe1.csv")
sns.heatmap(d3.corr()) #인자로 전달된 DataFrame의 각 열 사이 상관관계를 히트맵으로 그린다.

- hist(): x축에는 bins로 지정된 리스트(list2)에 대응되는 범위가 그려지며, 인자로 전달된 리스트(list1)의 값들 중 각 범위에 해당하는 값의 개수가 그때의 x값 범위에 대응되는 y값으로 히스토그램을 그린다.

- kdeplot(): x축은 s1의 값들이 갖는 범위로, 각 x에 대응되는 y값은 s1의 값들이 등장하는 빈도로 그려지는 히스토그램을 좀 더 smooth한 곡선으로 그린다.

  • shade: True로 지정하여 전달하면 곡선 아래가 색칠된다.

  • ax: axes 객체를 지정하여 전달하면 그 axes 객체 안에 그 그래프를 그린다.

3. catplot()

1
sns.catplot(x="col1", y="col2", hue="col3", col="col4", data=d3, kind='strip').fig.set_size_inches(w, h) #catplot()은 직접 .fig.set_size_inches() 함수를 써서 그 크기를 정할 수 있다.

catplot()은 하나의 DataFrame 안에 있는 여러 개의 속성 사이 관계를 추론할 때 사용할 수 있는 그래프 도시 함수이다.

  • data: 그래프를 그릴 DataFrame을 지정하는 인자이다. 생략할 수 없다.

  • x: 그래프의 x축으로 할 속성을 지정하는 인자이다. 속성이 수치형 값을 갖지 않아도 지정할 수 있다. 이 경우 그 속성의 각 값이 x축을 따라 일렬로 나열된다. 생략할 수 없다.

  • y: 그래프의 y축으로 할 속성을 지정하는 인자이다. 이 인자는 생략할 수 있는데, 이 경우 x축의 각 값의 개수가 그때의 y값이 된다. (마치 주어진 DataFrame을 x축으로 지정된 속성으로 groupby() 연산을 수행한 후 count() 그룹연산을 수행한 Series로 그린 것 같은 그래프가 그려진다.)

  • hue: 이를 지정하여 인자로 전달하면, hue로 지정한 속성의 각 값마다 그 값일 때의 x-y 사이 관계에 관한 그래프를 서로 다른 색깔로 그린다. (범례는 자동으로 표시된다.)

  • col: 이를 지정하여 인자로 전달하면, 전체 그래프 영역을 x축 방향을 따라 여럿으로 나누어 각 영역을 col로 지정한 속성의 각 값마다 할당한 후 각 영역에 그 속성값일 때의 x-y 사이 관계에 관한 그래프를 각각 그린다.

  • kind: 어떤 형태의 그래프를 그릴 것인지 지정하는 인자이다. 지정하지 않으면 strip 형태의 그래프를 그린다.

    • strip: 각 x에 해당하는 y값을 단순히 점으로 찍은 그래프를 그린다. 같은 x값에 여러 개의 y값이 있을 경우 좌우로 약간 거리를 두어서 점을 찍는다. (각 점 사이 거리는 무작위적이며, 서로 겹칠 수도 있고 멀리 떨어질 수도 있다.)

    • swarm: 각 x에 해당하는 y값을 단순히 점으로 찍은 그래프를 그리되, 같은 x값에 여러 개의 y값이 있을 경우 좌우로 일정한 거리를 두어서 점을 찍는다. 만약 y값이 같은 경우가 너무 많다면 더 표시하지는 않는다.

    • violin: 각 x에 해당하는 y값을 그래프 상에 표시하되, 같은 x값에 여러 개의 y값이 있을 경우 그만큼 좌우 폭을 넓게 표시하는 그래프를 그린다. 각 x값마다 x축에 수직 방향으로 서있는 바이올린 모양 그래프가 나온다 하여 violin이란 이름이 붙었다.

    • point: 각 x에 해당하는 y값들을 모은 후 각각 평균을 내 그 평균값을 각 x에 해당하는 y값으로 하는 점을 찍고 이 점들을 이은 꺾은선 그래프를 그린다. 한편, 각 x에는 그에 해당하는 y값의 최솟값과 최댓값의 범위를 x축에 수직 방향인 수직선으로 표시한다.

    • count: y축을 생략하고 kind로 count를 지정할 경우, 막대그래프를 그린다.

    • bar: 각 x에 해당하는 y값을 막대그래프로 그린다. 동시에 막대그래프 막대의 위쪽 변 가운데에 표준편차를 뜻하는 까만 수직선이 그려진다.

      • ci: 표준편차 수직선의 표시 여부를 결정하는 인자. False를 인자로 전달하면 표시되지 않게 할 수 있다.

      • dodge: hue로 한 x값에 대해 여러 개의 막대그래프를 그리게 했을 때, 그 막대그래프들을 하나로 이은 막대그래프를 그리게 할지 아니면 x축 방향을 따라 일렬로 나열되게 할지를 결정하는 인자. False를 인자로 전달하면 막대그래프들을 하나로 이은 막대그래프를 표시한다.