ch1_01_01 Making Figures and Axes(plt.figure, fig.add_subplot)

데이터 시각화를 위한 파이썬 강좌의 맛보기 강의입니다.

강의 대본

안녕하세요, 신영식입니다. 그럼 본격적으로 데이터 시각화를 위한 파이썬의 첫 번째 챕터를 한번 시작해 보도록 하겠습니다. 일단 첫 번째 챕터는 Matplotlib의 Anatomy 즉 해부를 한번 해 보도록 할 거예요. 아마 여러분이 이 강의가 끝나더라도 계속 레퍼런스 자료로 남겨둘 수 있는 챕터가 될 거예요. 그래서 첫 번째 배우게 될 강의는 바로 Figures와 Axe, Axes라고도 부르는 이 부분에 대해서 배우도록 할 거예요. 그래서 사실 이 부분은 되게 다룰 게 많아요. 여기서부터 기초 공사가 시작되는 것이기 때문에 여러분이 이 부분부터 잘 다지고 가셨으면 좋을 것 같아서 내용을 심도 있게 다루었습니다. 그래서 첫 번째 강에서는 이 3개를 다룰 거고 다음에서는 이렇게 그리고 마지막 조금 특이한 add axes라는 method를 쓰는 방법에 대해서 한번 배워보도록 할 거예요. 그럼 여러분이 이렇게 물어볼 거예요. 나는 Matplotlib이 처음이어서, 지금 배우는 부분이 여기인데 Figures나 Axes가 뭔지 모르겠다고 하시는 분들을 위해서 간단하게 설명드릴게요. 일단 Figure라고 부르는 것은 전체 도화지라고 생각하시면 되는 거예요. 그래서 Figure를 하나 뽑았다, 만들었다고 하면 여기에 그림을 그리면 되는 거 아니냐고 하는데 Axes는 왜 필요하냐 즉 여기가 axe가 될 것이고 ax1이라고 해 볼까요. 여기에 ax2라고 한번 만들어 보면 여기는 서로 다른 그림을 그릴 수 있게 되는 거예요. 생각보다 여러분이 논문이나 발표 자료 같은 것들을 보게 되면 하나의 Figure 안에 여러 개의 ax들이 들어가 있는 것을 볼 수가 있단 말이에요. 그렇기 때문에 하나의 figure 안에 여러 개의 그림을 그리기 위해서 이런 식으로 figure를 그리고 axes를 만든 뒤에 그 뒤에 그림을 그리게 되는 거예요. 그럼 일단 예시를 한번 살펴보도록 할게요. 첫 번째 논문에서는 이것 자체가 하나의 figure가 되는 거예요. 그래서 figure를 하나 만들었다고 치면 이 안에 그림이 하나 들어와 있죠. 라인 플롯이 하나 들어 있는데 여기 ax가 하나가 되는 거예요. 그래서 이것 같은 경우에는 하나의 Figure에 하나의 axes, ax를 그리게 되는 거죠. 그리고 참고로 ax가 하나 그리고 ax 2개 여러 개 모이게 되면 이것의 복수형을 axes라고 부르게 되는 거예요. 그랬을 때 두 번째 예제를 한번 보면 여기서부터 왜 axes가 필요한지 한번 살펴볼 수가 있게 되는 거예요. 첫 번째 같은 경우에는 이것 같은 경우에 하나의 Figure에 3개의 Axes 즉 여기가 ax1 그다음에 여기가 ax2 그리고 여기가 ax3로 볼 수 있게 되는 거죠. 그렇기 때문에 하나의 Figure 안에 여러 개의 그림을 그리게 되는 경우들이 생각보다 되게 많단 말이에요. 그래서 여러분도 axes와 figure를 제대로 다루는 방법에 대해서 철저하게 한번 배우고 넘어가셨으면 좋겠어요. 이것뿐만 아니라 어떤 식으로 들을 수 있게 되냐 하면 이런 식으로 지금 4개를 깔았는데 첫 번째를 비교해보자면 우리는 뒤에서 그리드 시스템, Axes 시스템을 배워 볼 것이기 때문에 여기서 알 수 있는 게 뭐냐 하면 행렬로 한번 생각해 보도록 할게요. 메이트릭스, 행렬로 한번 생각해 보면 이것은 3, 1 즉 로우가 3개고 칼럼이 하나인 것 이것 같은 경우에는 로우가 2개고 칼럼이 2개인 이런 상황으로 생각할 수가 있단 말이에요. 이렇게 만드는 게 바로 Axes, 그리드 시스템이라고도 부를 수 있고 사실 딱히 부르는 일은 없는데 이것을 행렬로써 생각할 수가 있다는 것이 중요한 개념이 되는 거예요. 이것뿐만 아니라 조금 더 복잡한 모양도 만들어낼 수 있어요. 이 논문에서는 이렇게 만들었네요. 하나의 axes, 여기 ax1 같은 경우에는 어떤 라인 플롯이 들어가 있고 여기가 두 번째 그다음 여기가 세 번째 ax가 들어가게 되는 거죠. 그래서 표현하고 싶은 다른 그림들을 각각의 ax에 그리게 되는 게 나중에 수준 높은 연구나 이런 것들을 하게 되면 이런 그림들을 대부분 사용하시게 될 거예요. 그렇기 때문에 참고해 주셨으면 좋겠고요. 마지막 그림 같은 경우에는 조금 더 복잡한 모습이 보이는 거죠. 여러 개, 지금 하나의 그림들은 전부 다 ax예요. 근데 여기서 다른 점이 뭐냐 하면 여기서부터 한번 살펴볼까요. 이것의 크기와 이것의 크기가 이렇게 다르게 돼요. 그리고 이것도 이 ax와 이 ax, ax, ax 크기가 전부 다 다르게 된단 말이에요. 그랬을 때 제가 강조하는 것은 이런 거예요. 아니 이렇게까지 복잡한 그림을 나는 그릴 것 같지 않은데 이것을 무조건 배워야 하냐고 생각하면 굳이 안 배워도 되긴 되는데 여러분이 나중에 이런 것들이 필요하게 되는 순간이 반드시 올 거예요. 그렇기 때문에 모르고 못 쓰는 것과 알고 안 쓰는 것과는 다른 개념이잖아요. 그러다 보니까 이번 강의를 통해서 이런 내용이 있구나라는 것만으로도, 알고 있는 것만으로도 나중에 필요할 때 갖다 쓸 수 있도록 큰 도움이 될 거예요. 이런 식으로 불규칙한 모습을 만들어낼 수 있는 것뿐만 아니라 지금 이것 같은 경우에는 스페이싱이 없네요. 그냥 딱 달라붙어 있는 Axes 이런 것들도 생각해 볼 수가 있게 되는 것이고요. 그다음에 나중에 보여드릴 것 중의 하나가 뭐냐 하면 이런 ax들 지금 이것과 이것의 특징, 차이점이 뭐가 되냐 하면 이와 같은 경우에는 딱 정형화된 것에 한 칸, 한 칸 이런 식으로 들어가 있는 것을 지금까지 봤단 말이에요. 그런데 얘 같은 경우에는 전체 Figure의 그림이 불규칙적으로 들어가 있는 거예요. 내가 그린 그림이 불규칙하게 크기도 불규칙하고 그다음 위치도 불규칙한 모습까지도 그릴 수가 있게 되는 거예요. 이와 같은 것들을 배워 놓으면 나중에 어떻게 쓸 수 있게 되는 것이냐 하면 정확히 이것 같은 경우에는 여러분이 이렇게 생각할 수 있을 거예요. 2 by 2개가 들어가 있고 여기도 2개죠. 그래서 2 by 2라고 생각을 해야 되나 생각해 봤는데 행렬 같은 경우에는 2 by 2는 이렇게 생겼잖아요. 근데 얘는 약간 바이어스가 걸려 있는 크기가 다른 모습을 볼 수 있게 되는 거잖아요. 그렇기 때문에 이런 식의 앞부분에 있는 불규칙적인 그림을 그릴 수 있는 방법을 알게 된다면 이런 그림 또한 그릴 수 있게 되는 것이고 더 나아가서는 이런 것들도 되게 많이 보여요. 실제 논문을 보다 보면 전체 Figure가 있는데 그 안에 추가적인 정보를 넣고 싶을 때 이것들도 ax거든요. 그렇기 때문에 이렇게 그리는 방법 그리고 또 많이 쓰이는 방법 중의 하나가 줌 플롯이라고 부르는 건데 이것 같은 경우는 이 부분을 확대해서 이 부분을 따로 그려 주는 것이죠. 이것도 마찬가지로 ax인 거예요. 그랬을 때 조심해야 될 것은 이것도 ax, 전체 ax1이라고 하면 예를 들어서 이름을 ax_zoom 이런 식으로 이름을 붙일 수 있게 되는 것이고요. 이렇게 Figure 하나를 그려 놓고 그 안에 다양한 모습의 Axes를 배치할 수 있는 능력을 갖추는 것이 나중에 진짜 수준 있는 정보 전달이 잘 되는 그림을 그리게 해 줄 수 있는 능력이 될 것이라고 생각해요. 그렇게 하면 두 번째 주제로 Figure부터 어떻게 그리는지 그려야겠죠. 일단 첫 번째 도화지를 Figure라고 불렀잖아요. 그러니까 이것부터 만드는 방법을 한번 살펴봐야겠죠. 그래서 지금부터 나오는 pyplot이라고 하는 것은 plt 이렇게 줄여서 Import를 하게 될 거예요. 그렇기 때문에 이것은 plt.figure 이런 식으로 제가 피규어라고도 말할 수 있고 피거라고도 말할 수 있는데 둘 다 똑같은 거예요. 영국식, 미국식 발음 차이이기 때문에 그건 신경 안 쓰셔도 되는 것이고요. 그러고 나서 일단 간단하게 테스트로 argument를 한번 넣어 보도록 할게요. figsize 딱 봐도 figure의 전체 사이즈를 말하는 것이고 이것 같은 경우에는 이 바탕 색깔을 무슨 색으로 할 것인지 이것을 예시로 드는 이유는 이것은 엄청 많이 쓰여요. 거의 항상 쓰이는데 이것 같은 경우는 안 쓰이는 경우가 더 많단 말이에요. 하지만 여러분이 이런 식으로 plt.figure라는 메소드를 쓸 때 어떻게 argument를 넣게 됐는지를 설명드리기 위해서 facecolor도 한번 넣어 보도록 할게요. 그럼 필요한 matplotlib.pyplot을 plt로 이것은 전통적으로 plt라고 많이 쓰게 되는 것이죠. 그래서 plt를 Import하게 되는 것이고 그다음에 추가적으로 numpy array를 많이 쓰게 될 거예요. 이것 같은 경우에는 랜덤 데이터들을 만들어 내기 위해서 그리고 데이터를 가공할 때, 다룰 때 조금 더 편하기 때문에 numpy를 많이 쓰도록 하겠습니다. 그리고 이렇게 만들게 되는 건데 이것이 가장 기본적으로 쓰는 모습이에요. 그래서 plt.figure를 documentation에 나와 있는 것처럼 만들게 되면 이런 모습이 만들어지게 되는 거예요. 그런데 이것 같은 경우에는 상당히 작죠. 그래서 일단 도화지 전체가 바로 figure가 되는 거거든요. 그랬을 때 여기서 보는 것 중 하나가 개념도 되게 중요한데 첫 번째 이것에서 볼 수 있는 것 중 하나가 이 그림을 그린 다음에 리턴값을 fig라는 object 이름으로 붙이게 된다는 거예요. 그렇다는 것 자체가 이것이 이제부터 fig object라는 것으로 아니면 instance로 부를 수 있게 되는 것인데 이 안에 matplotlib을 제공해주는 다양한 method를 쓸 수 있게 되는 거거든요. 그렇기 때문에 사실 어떤 강의에서는 plt.figure 이런 식으로 만들고 그다음에 여기에 plt.plot 이런 식으로 그림을 그리게 되는 건데 차이점이 뭐냐 하면 이것을 object로 다루게 되는 순간 method들을 훨씬 더 비교도 안 되게 자유롭게 쓸 수 있게 되는 거거든요. 그렇기 때문에 matplotlib에서 공식적으로 설명할 때도 웬만하면 object를 사용하는 방법이 더 좋다고 말하고 있거든요. 나중에 가다 보면 단순히 plt.plot 이렇게 쓰는 것보다 여기에 object를 할당해서 쓰는 것이 강의가 조금만 지나면 훨씬 더 효율적인 방법이라고 이해를 하실 수 있을 거예요. 그다음에 다음으로 한번 해 볼 것은 방금 말씀드렸던 것처럼 figsize 같은 경우는 figure를 만든다고 치면 무조건 넣어 주게 되는 건데 이런 식으로 넣어 주게 되는 거예요. 그래서 오른쪽 길이 즉 width, height 이런 식으로 넣어 주게 되면 아까 그림보다 더 큰 그림이 나오게 되는 거죠. 그래서 이렇게 7, 7 확실히 기억은 안 나는데 아마 인치 단위일 거예요. 그런데 여러분이 어차피 나중에 이것을 가지고 PPT 발표 자료를 만들 때는 resizing 하잖아요. 그렇기 때문에 비율만 생각해 주시면 되는데 웬만하면 조금 넉넉히 왜냐하면 이것은 좀 practical 한 팁인데 당연한 것 같기도 하지만 작은 figure를 만들어 놓고 발표 자료에서 확대해버리면 깨지잖아요. 그렇기 때문에 저 같은 경우도 보통 15 by 15 오른쪽으로 길어야 한다 싶으면 20 by 15 아니면 정말 큰 발표장에서 해야 한다면 프리젠테이션도 되게 크게 해야 되겠죠. 그렇기 때문에 100 by 50 사이즈는 되게 크지만 그래서 이렇게 크게 만드는 모습도 볼 수 있게 되는 거예요. figsize 같은 경우에는 width와 height를 결정해 주는 것으로 생각해 주시면 될 것 같아요. 그다음 다른 방법으로 예를 들어서 facecolor라는 argument를 넣는 기본적인 방법도 한번 사용해 보도록 할게요. Documentation에서 facecolor에 이런 식으로 넣어 주게 될 건데 이 같은 경우는 linen이라는 색깔이에요. 이 색깔에 대해서도 여기에 r을 넣을 수도 있고 아니면 숫자도 넣을 수 있거든요. 0.5, 0.2, 0.3 이런 식으로 넣어 줄 수도 있거든요. 알파 값까지도 넣어 줄 수가 있게 되는 건데 이 부분은 뒤의 컬러 강의에서 한번 자세히 다루어보도록 할게요. 만약 이렇게 그리면 이 그림은 이렇게 바뀌게 되는 거예요. 즉 figure 전체에 facecolor가 linen 색깔로 바뀌게 되는 거예요. 이 같은 경우는 네임드 컬러도 이 뒤에서 정리를 한번 해 보도록 할게요. 이렇게 해서 기본적으로 논문이나 발표 자료에서 쓸 그림을 만들기 위해서는 전체 도화지를 꺼내는 게 바로 figure다. 그래서 plt.figure를 만들고 나서 figure object로 받는 것을 앞으로 계속 사용하게 되리라는 것을 말씀드리고 싶어요. 그러면 제가 바로 이어서 하나의 figure에 여러 개의 그림을 그릴 수 있다고 했었단 말이에요. 그러면 그림을 넣는 ax 이것들이 각각 ax라고 했었잖아요. 이것도 ax 이것도 ax2, ax1 이런 식으로 이름을 붙일 수 있을 것이란 말이에요. 그러면 ax를 넣는 방법에 대해서 한번 살펴보도록 하겠습니다. 일단 Documentation을 보면 add subplot이라는 것인데 이 같은 경우에는 이렇게 만들어낼 수가 있어요. 방금 배웠던 것처럼 figure라는 object를 받게 되면 여기 그림 도화지에서 add subplot 하나 더 그릴 거예요. 그리고 그것의 이름을 ax object로 이름 붙이게 된다는 거예요. 그러면 무슨 일이 발생하는 거냐 하면 여기에 fig object가 있었고 우리는 상상 속에서 그리는 거예요. 이 안에 ax라는 object를 하나 그리게 되는 거예요. 여기에 그림을 그리게 되는 거죠. object를 이용해서 그림을 그리게 되는 거예요. 예시를 한번 살펴보자면 add subplot을 하게 됐죠. 여기까지 이 모습이라면 add subplot을 하나 써주게 되면 바로 이 안에 그림이 생기게 되는 거예요. 이제 여기에 그림 그릴 준비를 하게 되는 거예요. 그래서 여러분이 지금 아셔야 되는 것이 뭐냐 하면 방금 말씀드렸던 것처럼 ax라는 object에 그림을 그릴 수 있게 해 주는 것이란 말이에요. 그렇기 때문에 여기에 line plot도 그릴 수 있게 되는 거고 scatter plot도 그릴 수 있는 것이고 심지어 3d plot도 그릴 수 있게 되는 것이고 뒤에 물론 다른 argument 하나를 넣어 주긴 해야 되겠지만 그래도 이것을 그릴 수 있게 되는 것이고 histogram도 그릴 수 있고 이미지를 그려줄 수 있는 imshow라는 사진을 넣어 줄 수 있게 되는 것이고 이 하나에 ax를 할당받는 순간 이 안에는 matplotlib에서 제공하는 모든 그림을 그려 줄 수 있게 해주는 아주 좋은 도구가 되는 거예요. 다음으로 넘어가서 예시를 한번 그려 보도록 할게요. 어떤 것이 있냐 하면 add subplot을 했을 때 이 뒤에 같은 라인이라고 생각해 보세요. 그다음에 이 그림에 plot을 그리게 되는 거예요. line plot을 그리게 되면 이 안에 이런 그림이 그려지게 되는 거예요. 아니면 scatter plot도 그리게 되는 건데 x값들의 array, y값들의 array를 그려주게 된다면 이런 식으로 2, 2 그림 좀 작아서 잘 안 보이는데 여기인 것 같아요. 그다음에 3, 3인가요. 그래서 정확히 이 그림이 맞는지는 잘 모르겠네요. 일단 제가 여기서 하고 싶은 말은 뭐냐 하면 어떤 figure에 ax를 할당받게 되고 ax object를 만들게 되고 그럼 이것을 통해서 만들게 되면 여기에는 line plot도 그릴 수 있고 scatter plot도 그릴 수 있고 다양한 그림들을 여기에 그리게 해 주는 도구가 될 것이라고 말씀드리고 싶어요. 그다음에 matplotlib에서 Axes를 잘 그리기 위해서는 그리드 시스템을 한번 알아봐야 돼요. 제가 말하는 것처럼 뒤에서 다루겠지만 그리드라는 것은 사실 이런 라인들이거든요. matplotlib에서 말고 일반적으로 쓰이는 그리드라는 것은 격자라는 것이겠죠. 그래서 Axes 즉 ax들은 각각 어떤 그리드 시스템 안에 들어가게 되어 있는 거예요. 그래서 예를 들어서 제가 첫 번째 이 같은 경우는 ax, ax, ax 전부 다 ax죠. 근데 이것을 행렬로 한번 보도록 할게요. 그러면 이 같은 경우는 로우가 3개, 칼럼이 3개인 모습을 그리게 될 수 있을 것이고 만약 행렬이라고 한번 쳐 보게 되면 이것은 0, 0 아니면 수학으로 따지자면 이것은 (1,1), (1,2), (1,3) 이런 식으로 쭉 가게 되는 것이죠. (2,1), (2,2), (2,3) 이런 식으로 원소의 배치를 하게 되는 거잖아요. 그렇기 때문에 그림 Axes 입장에서 똑같이 접근할 수 있어요. 이 같은 경우에는 ax 그런데 파이썬 프로그램은 인덱스가 0부터 시작하니까 이런 식으로 비교가 되는 거예요. 다른 색깔로 한번 해 볼까요. 이것 같은 경우에는 ax 0,1 이것 같은 경우는 ax 0,2 그리고 이것 같은 경우는 똑같은 인덱싱하게 되면 이런 식으로 그래서 최종적으로 가게 되면 얘는 2,2까지 가게 되는 거죠. 이런 식으로 Axes들이 하나의 행렬 형태 즉 예를 들어서 이런 것들도 표현이 되겠죠. 이와 같은 경우는 ax, 지금 하나의 array니까 0, ax1 이런 식으로 인덱싱이 될 건데 다시 한번 그려볼까요. 예를 들어서 이렇게 그리게 된다면 얘는 3 by 2잖아요. 그렇기 때문에 최종적인 경우에는 여기가 (0,0), (0,1) 이런 식으로 가게 되는 거죠. 그렇기 때문에 이와 같은 경우에는 1,2 이런 식으로 가게 될 수가 있게 되는 거죠. 아니죠, 2,1 이죠. 지금 잘 안 보이니까 2,1 이런 식으로 인덱싱이 가능하다는 것을 알아주셨으면 좋겠어요. 그래서 Axes들도 전부 다 하나의 그리드 시스템 안에서 표현해 줄 수가 있다는 것을 아셨으면 좋겠습니다. 그래서 이런 식으로 표현하게 될 건데 이와 같은 경우에는 무슨 의미를 하는 것이냐 하면 첫 번째 앞에 나와 있는 숫자는 바로 Row의 개수예요. 그러니까 이 그림에서 전체로 Row는 몇 개를 그리겠다. 지금은 1개인 것이죠. 그리고 이 뒤에 있는 것은 전체 칼럼은 몇 개를 그리겠다. 그리고 이 ax는 그것에서 몇 번째 ax라는 것을 말해 주고 있는 거예요. 예시를 한번 바로 들어 보도록 할게요. 그리고 추가적으로 이런 식으로 표현을 해줄 수가 있어요. 그러니까 1, 1, 1로 써줄 수 있는 건데 1, 1, 1로 써줘도 전부 다 똑같은 표시를 하게 되는 거예요. 그런데 이것을 왜 써주게 되는 것이냐 하면 한번 예를 들어볼게요. 여기가 쭉 가서 10개를 그린다고 쳐봐요. 그럼 여기에 10개 이런 식으로 넣어 주게 되면 이것이 10인지 이렇게 헷갈린다는 말이에요. 즉 여기 있는 숫자들이 숫자 2개 이상으로 될 때는 이런 식으로 써 주는 것이 더 좋다. 이 뒷부분에 있는 예시를 보게 되면 충분히 이해가 가실 거예요. 그러면 예를 한번 만들어 보도록 할 텐데 일단 fig object를 하나 만들게 되는 것이고 이것에 1, 1, 1 앞부분에 있는 그림 같은 경우에는 전체 figure 하나에 ax가 하나 그려져 있었단 말이에요. 그렇기 때문에 전체 Row도 하나 그다음에 칼럼도 하나 첫 번째 그림이다. 그러니까 이런 식으로 그려주게 되면 바로 이렇게 그려주게 되는 거예요. 똑같은 결과가 나오는 것이고 앞에서 봤었던 것처럼 기본적으로 add subplot이라는 것은 sub plot argument를 안 넣어 주게 되면 기본적으로 이것을 말해 주는 거예요. 그렇기 때문에 앞부분과 결과가 똑같은 것인데 다음 예시를 한번 보면 조금 차이가 보이게 될 거예요. 일단 ax1 이렇게 object 이름을 바꿨어요. 근데 이와 같은 경우는 3 1 1 이렇게 만들어 보도록 할 거예요. 그러면 얘 입장에서 뭐냐 하면 이 fig object에 3개 그리고 1개를 그릴 거예요. 3개, 1개를 그릴 것이라고 만들어 놓고 이 3개, 1개는 각각 이렇게 위치가 되겠죠. 그중에서 첫 번째 것을 ax1 object로 만들 것이라고 해 놓은 거예요. 그렇기 때문에 좀 헷갈리니까 지우고 그다음에 제가 3 1 2 이런 식으로 만들어 볼게요. 그럼 얘는 똑같은 것이죠. 이 fig에 3개, 1개를 만들 거고 이 중에서 두 번째 것이 바로 ax2 object예요. 그리고 마찬가지로 3 1 3 이렇게 주면 3개, 1개 중에서 세 번째 ax가 바로 ax3다. 이런 식으로 이름을 붙여주게 되는 것이죠. 그러면 바로 이런 결과가 나오게 되는 거예요. 그러면 이것에 그리려면 ax1 object에 접근해야 되는 것이고 이것에 그림을 그리려면 ax2 object 이것에 그림을 그리려면 ax3 object에 접근해서 여기에 마찬가지로 아까 말씀드렸던 것처럼 line plot을 그릴 수도 있는 것이고 여기에는 scatter plot을 그릴 수 있게 되는 것이고 여기에는 histogram을 그릴 수 있게 되는 것이고 다양하게 바로 접근을 할 수가 있게 되는 거예요. 그렇기 때문에 이런 Axes를 만드는 방법에 대해서도 기본적으로 잘 알고 계셔야 될 것 같아요. 그다음에 예시를 한번 들어 보도록 할게요. ax1에 이런 식으로 쓰게 된다는 거예요. 첫 번째 그림에 plot을 그릴 거예요. 두 번째 그림에 plot을 그리게 될 거예요. 이렇게 되면 각각에 맞는 데이터들을 시각화해줄 수가 있는 거예요. 그러니까 앞부분에 나와 있는 논문들도 각각 필요한 데이터들은 ax1에 플롯을 해 주는 것이고 ax2에 그릴 것들은 ax2에 접근해서 line plot을 그려주게 되는 것이겠죠. 그러면 2 by 2에 대해서 한번 살펴보도록 할게요. 그러니까 전체 figure object가 이렇게 만들고 이것 같은 경우는 첫 번째 Row, 첫 번째 Column의 ax 인덱스가 0부터 시작하기 때문에 이런 식으로 만들어지게 될 것이고 이것 같은 경우에는 ax 0, 1 이것은 ax 1, 0 이런 식으로 만들어 주게 될 것이고 얘 같은 경우는 ax 1, 1 이렇게 만들어 주게 되겠죠. 이것을 코드상에서 한번 구현해 보도록 할게요. 앞부분에서 다루었던 것과 차이점을 만들기 위해서 이 회색 표시는 여러분이 신경을 안 쓰셔도 되는 거예요. 비교를 위해서 코드를 약간 그레이 처리를 해 놓은 거예요. 그랬을 때 앞부분에서 다룬 것을 만들기 위해서는 전체 figure 자체가 2 by 2로 만들었었죠. 그렇기 때문에 2 by 2에서 첫 번째 그림이다. 이것이 바로 첫 번째 그림이거든요. 여기서 하나 더 말씀드릴게요. 행렬에서 element를 셀 때 여기서 이런 식으로 센단 말이에요. 행렬에서도 얘 하나, 얘 하나, 얘 하나 예를 들어서 numpy에서도 flatten이라는 함수가 있죠. method가 있는데 얘를 쓰게 되면 이런 식으로 또 펴준단 말이에요. 즉 행렬을 읽을 때 원소를 하나씩 빼와야 하는 상황이라면 이 방향으로 빼오게 되는 거예요. 그렇기 때문에 matplotlib에서도 똑같이 2 by 2를 만들 것이다. 그래 2 by 2 만들 것이구나 이런 식으로 그리드 시스템 만들어 주고 그중에서 첫 번째 그림이 바로 ax1이라는 이름으로 붙여 주게 되는 거예요. 그럼 마찬가지로 똑같이 그림을 그릴 수가 있겠죠. 여기를 지우고 보면 ax2 같은 경우에는 두 번째 그림이니까 ax2 그리고 ax3는 여기 이렇게 각각 차례대로 들어가 주게 되는 거겠죠. 그래서 ax1, 2, 3, 4 object를 만들게 되면 그 결과는 이런 식으로 나올 수가 있게 되는 거예요. 물론 여기 있는 1 이런 것들도 나중에 다 설정하는 방법들도 배우게 될 거예요. 그래서 기본적으로 여러분이 아셔야 될 것이 사실 Axes 같은 경우에는 3차원으로 그릴 수가 없는 거죠. 최대 2차원 그림을 그린다는 말이에요. 여러분이 발표 자료나 논문에 쓸 자료를 만들 때는 2차원 자료를 만들기 때문에 여기까지 알아두시면 좋을 것 같아요. 이것을 추가적으로 여러분한테 말씀을 드린다면 subplot 이렇게 한 다음에 얘 같은 경우에 아예 똑같은 내용이 2, 2, 1 이런 식으로 넣어 주면 되는 것이고 차례대로 2, 2, 2 이렇게 된다는 거예요. 그래서 여러분이 만약 여기에 10, 1, 1이다. 이런 식으로 만들어 주게 되면 10개를 그린다는 거거든요. 그중에서 하나, 둘 이것 같은 경우는 for문을 통해서 그리는 것이 좋겠죠. 이런 식으로 그릴 수 있게 됐다고 말씀을 드릴 수 있을 것 같아요. 그랬을 때 재밌는 특징이 하나 보일 수가 있게 되는 것인데 예를 들어서 제가 이것을 하나 비교를 들어 보도록 할게요. 이 ax1 같은 경우에는 어떻게 접근을 하게 되냐 하면 2 by 2를 그려놓고 여기 기준에서 첫 번째 그림 얘가 ax1이었다는 말이에요. 여기를 다시 한번 짚고 다음 내용을 한번 다루어보도록 할게요. 뭐냐 하면 이것 같은 경우 이런 그림을 그리기 위해서 어떻게 그려야 될까 생각을 한번 해 보면 약간 머리를 굴리는 것이죠. 뭐냐 하면 첫 번째 같은 경우의 그림을 볼게요. 그러면 2 by 2를 그린대요. 그러니까 2 by 2를 그리는데 여기가 바로 ax1이구나 이런 식으로 만들었단 말이에요. 근데 두 번째 그림은 이런 식으로 그리고 2 by 2로 그리게 되면 그다음 두 번째 그림이 되니까 이런 식의 여기가 되는 거죠. 앞부분과 완전 똑같아 보이죠. 그런데 다음에서 좀 달라져요. 뭐냐 하면 이것의 입장에서는 어떻게 그리게 되는 것이냐 하면 ax3 입장에서 뭐냐 하면 이 fig를 2 by 1으로 보는 거예요. 2 by 1이죠. 그렇기 때문에 2 by 1으로 보게 되는 것이고 그러면 이런 그림이 그려지게 되는 거죠. 그중에서 두 번째 그림이 바로 ax3인 거예요. 그렇기 때문에 ax1과 2는 그리드 시스템을 공유하고 있어요. 2 by 2 중에서 이것이 하나 이것 하나 그렸기 때문에 여기가 ax1, 여기가 ax2가 될 텐데 ax3 입장에서는 그리드 시스템을 보는 입장을 달리 하는 거예요. 2 by 1으로 보게 될 것이니까 여기 하나, 여기 하나 중에서 내가 차지하는 여기를 ax3로 만들 것이라고 하게 되면 여기서 바로 결과가 만들어지는 거죠. 그렇기 때문에 앞부분에서 썼던 것에서 조금만 활용법을 다르게 한다면 이런 불규칙적인 그리드 시스템 즉 ax의 위치나 크기가 다른 것들도 조금 더 쉽게 만들어 낼 수가 있게 되는 거예요. 그러면 여러분한테 잠깐만 스페이스를 눌러 놓고 과제를 하나 드리도록 할게요. 잠깐 퀴즈를 하나 드리고 이런 시스템을 하나 만들어놓고 한번 시작해 보셨으면 좋겠습니다. 저는 바로 강의를 시작하도록 할 테니까 여러분이 반드시 matplotlib을 켜놓고 이것을 다시 한번 복습을 해 놓고 그다음에 이것을 한번 그려 놓고 다시 한번 강의를 들으셨으면 좋겠습니다. 저 같은 경우는 바로 시작해 보도록 할게요. 일단 이것의 입장에서 한번 보도록 할게요. 색깔이 바뀌었네요. 그럴 때 각각의 입장에서 보면 중요한 것이 뭐냐 하면 같은 그리드 시스템을 공유하고 있는 것이라고 생각이 들어요. 이것 같은 경우는 혼자서 다른 그리드 시스템을 생각하고 있는 것 같아요. 그래서 이것의 입장에서 한번 볼게요. 그러면 이것의 입장에서는 이렇게 나누었던 것 같아요. 그래서 이것의 입장에서는 전체를 2, 3 중에서 자기가 1이라고 생각하고 있는 것이고 이것은 2, 3 중에 2. 그런데 여기서 조심해야 해요. 그러면 이것은 3인 것이 아니죠. 이것이 2, 3, 3이었는데 그러면 이것이 2, 3, 4죠. 그렇기 때문에 이런 식으로 그리고 이렇게 생각할 수 있게 된 것이고요. 여기 있는 그림 같은 경우에는 다시 한번 그려보면 이렇게 이렇게 이렇게 이 중에서 세 번째 그림이에요. 그렇기 때문에 이것은 전체를 하나 그리고 3개 그중에서 세 번째 이런 식으로 만들어 줄 수가 있게 되는 것이겠죠. 실제 코드로 한번 돌려 보도록 할게요. 그랬을 때 fig 1 같은 경우에는 제가 말씀드렸던 것처럼 2, 3으로 본 것이죠. 그중에서 첫 번째, 이것은 두 번째죠. 그리고 이것 같은 경우는 여기가 세 번째였으니까 여기가 네 번째가 되는 것이죠. 그래서 이것은 4 그리고 이것은 5 이런 식으로 만들게 되는 것이고 이것 같은 경우는 1 3 3 아까 말씀드렸던 것과 완벽하게 동일한 결과를 얻는 것을 볼 수 있게 되는 거겠죠. 그래서 여러분이 실제로 이런 식의 그림을 그리게 되는 경우도 은근히 많아요. 여기서 강조하고 싶은 것이 다른 그림이라든가 아니면 실제로 여기는 비슷한 그림을 그려놓고 여기서는 이것들을 설명해 주는 그림을 그려 줄 수 있게 되는 것이고요. 그렇기 때문에 이런 그리드 시스템에 대해서 이해를 하고 넘어가시는 것이 나중에 조금 더 수준 높은 그림을 그리는 데 필수적일 것이라고 생각해요. 그럼 제가 마지막에 강의를 마치기 전에 여기서도 마찬가지로 여기서 facecolor를 넣었죠. 이것도 matplotlib document를 찾아보게 되면 이런 facecolor라는 argument가 들어가게 되어 있어요. 그렇기 때문에 이런 식으로 각각 넣어 줄 수 있다는 거예요. 그랬을 때 이것의 결과 먼저 한번 보게 되면 이런 식으로 facecolor들을 입힌 것을 볼 수 있겠죠. 시각적으로는 분명히 이상하고 촌스러워 보여요. 그냥 argument를 쓰는 방법에 대해서 제가 말씀을 드리는 거예요. 여기서 제가 마치기 전에 facecolor를 쓰는 방법에 대해서 이렇게 말씀드렸는데 마지막으로 하나만 짚고 넘어가자면 linen, r, g, b 같은 경우에는 베이스 컬러라고 나중에 배우게 될 것이고 이것 같은 경우는 named color, linen이라는 이름을 붙이게 돼 있죠. 이런 것까지만 알고 넘어가셨으면 좋겠습니다. 그러면 일단 첫 번째 Figure와 Axes에 대한 강의의 첫 번째 부분은 마치도록 하겠습니다. 그럼 다음 시간에 계속 이어서 이 부분 첫 번째 강의 한번 이어서 설명을 드리도록 하겠습니다. 수고하셨습니다.

이 강좌의 강의

  • ch0_Introduction_to_the_Course
  • ch1_00 Intro to Matplotlib Anatomy
  • ch1_01_01 Making Figures and Axes(plt.figure, fig.add_subplot)재생 중
  • ch1_01_02 Regular Axes Alignment(plt.subplots)
  • ch1_01_03 Irregular Axes Alignment(plt.subplot2grid)
  • ch1_01_04 Making Figure and Axes Practices
  • ch1_01_05 Arbitrary Locations and Sizes(fig.add_axes)
  • ch1_02_01 Axes Alignment Customizing(fig.tight_layout, fig.subplots_ad
  • ch1_02_02 Axes Alignment Customizing(Practice)
  • ch1_02_03 Axis Shaing(sharex, sharey)
  • ch1_02_04 Axis Shaing(Practice)
  • ch1_02_05 Twinx and Axis Scale
  • ch1_03_01 Titles and Labels(fig.suptitle, ax.set_title, ax.set_xlabel)
  • ch1_03_02 Text and Title Alignment
  • ch1_03_03 Text Properties and Font Dictionary
  • ch1_04_01 Tick Params and Ticks(ax.tick_params, ax.set_xticks)
  • ch1_04_02 Tick Labels and Practices(ax.set_xticklabels)
  • ch1_05_01 Grid System
  • ch1_06_01 Spine Objects
  • ch1_06_02 Spine Locations
  • ch1_07_01 Colors in Matplotlib
  • ch1_08_01 Matplotlib Styles and rcParams
  • ch2_00 Intro to Line Plot
  • ch2_01_01 Line Plot Basics(ax.plot(y), ax.plot(x, y))
  • ch2_01_02 Several Line Plots and VH Lines(ax.axvline, ax.axhline)
  • ch2_02 Labels and Legends
  • ch2_03 Line Styles and Markers
  • ch2_04 Line Filling
  • ch2_05_01 Exercise1 and Exercise2
  • ch2_05_02 Exercise3
  • ch2_05_03 Exercise4 and Exercise5
  • ch2_05_04 Exercise6 and Exercise7
  • ch2_05_05 Exercise8
  • ch3_00 Intro to Scatter Plot
  • ch3_01 Scatter Plot Basics
  • ch3_02 Advanced Markers and Legend
  • ch3_03 Size Legend
  • ch3_04_01 Exercise1 and Exercise2
  • ch3_04_02 Exercise3
  • ch4_00 Intro to Bar Plot
  • ch4_01 Bar Plots Basics
  • ch4_02 Multiple Bar Plots
  • ch4_03 Rects Object
  • ch4_04 Horizontal Bar Plots
  • ch4_05_01 Exercise1 and Exercise2
  • ch4_05_02 Exercise3
  • ch4_05_03 Exercise4
  • ch5_00 Intro to Histogram
  • ch5_01 Histogram Basics
  • ch5_02 Arguments of Histogram
  • ch5_03 Multiple Histograms
  • ch5_04 Histogram and Gaussian KDE
  • ch5_05 Exercises
  • ch6_00 Intro to 3D and Contour Plots
  • ch6_01 3D Figure and Axes
  • ch6_02 3D Plots with 1D Arrays
  • ch6_03 3D Plots with 2D Arrays
  • ch6_04 Contour Plots
  • ch6_05 Filled and 3D Contour Plots
  • ch7_01 Image Read and Show
  • ch7_02 Stem Plots
  • ch7_03 Box and Whisker Plots
  • ch7_04 Pie Plots
  • ch7_05 Vector Field Visualization
  • Outro to the Course
데이터 시각화를 위한 파이썬
데이터 시각화를 위한 파이썬강좌 자세히 보기