빅데이터/Data Visualization

데이터 시각화 05 - Matplotlib (저장/텍스트/여러 데이터/막대그래프)

H-V 2022. 1. 21. 19:37

유투버 '나도코딩'님 강의 참조

 

 

 

 

01 Matplotlib 저장

plt.plot(x,y);
plt.savefig('graph.png')

# 크기를 조절하여 저장
plt.plot(x,y);
plt.savefig('graph.png', dpi=100)

 

 

 

02 텍스트

  • 그래프 내에 원하는 텍스트를 넣을 때 사용
x = [1,2,3]
y = [2,4,8]

plt.plot(x,y, marker='o');

for idx, txt in enumerate(y): # for 순서, 텍스트 in enumerate('순서대로 불러올 값')
    plt.text(x[idx], y[idx], txt) 
    
# x[0] = 1 , y[0] = 2, text[0] = 2
# x[1] = 2 , y[1] = 4, text[0] = 4
# x[2] = 3 , y[2] = 8, text[0] = 8
  1. 인덱스 + 값 + enumerate() 을 써서 포문을 돌림
  2. 'enumerate()' -  리스트, 튜플, 문자열에 순서를 넣어주는 함수, 즉 'y'의 리스트 값을 순서대로 들고 올 수 있음
  3. matplotlib 라이브러리의 .text()를 이용하여 텍스트를 찍는데 '그래프 상의 x 위치, y 위치, 그리고 삽입할 텍스트를 순서대로 입력
  4. 이때 enumerate()를 써서 괄호안의 값을 순서대로 받는 경우에는 x위치, y위치를 잘 지정해야 오류가 안난다
    (예: enumerate(y) 값을 순서대로 돌리는데 x위치에 y위치를 넣으면 오류가 터진다)
  5. x와 y값에 찍힌 부분에 텍스트를 찍으므로 정확한 x,y위치가 들어가야 한다!!

▶ 여기서 텍스트가 겹쳐있으니 잘 보이도록 해보자

plt.plot(x,y, marker='o');
# 텍스트 설정을 좀 더 디테일 하기 위한 설정
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.xticks([1, 1.5, 2, 2.5, 3])
plt.yticks([2,4,8,6,10]);



for idx, txt in enumerate(y): # for 순서, 텍스트 in enumerate('순서대로 불러올 값')
    plt.text(x[idx], y[idx]+0.2, txt, ha='center', color='red') #ha = horizontal 로 텍스트 위치 설정 가능
  1. x,y 축 라벨을 주면서 어디가 어디인지 확인
  2. 텍스트가 튀어나가니 y축을 길게 늘여뜨리면 안으로 들어 온다

 

 

02 여러 데이터 그리기

#Covid-19 백신 종류별 접종 인구

days = [1,2,3] # 일자
az = [2,4,8] # 단위 만명, 1일부터 3일까지 AZ 접종 인구
pfizer = [5,1,3]
moderna = [1, 2, 5]

plt.figure(figsize=(10, 5))
plt.plot(days, az, label='AZ')
plt.plot(days, pfizer, label='PFIZER', marker='o', linestyle='--')
plt.plot(days, moderna, label='MODERNA', marker='v', ls='-.')
plt.legend(ncol=3);
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.yticks(range(1,13));

for idx, txt in enumerate(az):
    plt.text(days[idx], az[idx]+0.3, txt, ha='center')

for idx, txt in enumerate(pfizer):
    plt.text(days[idx], pfizer[idx]+0.3, txt, ha='center')
    
for idx, txt in enumerate(moderna):
    plt.text(days[idx], moderna[idx]+0.3, txt, ha='center');

▶ 데이터에 대한 텍스트값 넣기가 약간 헷갈린다. 

  • 중요 포인트는 어느 데이터의 텍스트값을 순서대로 들고올거냐이다. 즉 enumerate('값')에 어떤 데이터의 값이 순서대로 올거냐를 잘 판단 해야 한다.
  • 또한 축에도 어떤 값이 들어가냐가 중요하다. 'plt.plot(x값,y값)' 을 잘 봐야 한다. 
    (x값에 days 가 들어가고 y값에 각 백신이 들어가는 형태)

 

 

 

03 막대 그래프

  • 막대를 활용하여 데이터를 시각적으로 표시하는 그래프
  • 막대그래프는 x축이 label, y축이 value가 된다
  • 일반 꺾은선 그래프는 .plot, 막대그래프는 .bar로 만든다
labels = ['Kang', 'Seo', 'Jung'] # 이름
values = [190, 187, 184] # 키

plt.bar(labels, values)

labels = ['Kang', 'Seo', 'Jung'] # 이름
values = [190, 187, 184] # 키
colors=['r','g','b'] # plt를 선언할때 색을 지정 할 수 있지만, 이렇게 변수화도 가능하다. 


plt.bar(labels, values, color = colors, alpha=0.3)

labels = ['Kang', 'Seo', 'Jung'] # 이름
values = [190, 187, 184] # 키

plt.bar(labels, values)
plt.ylim(175, 195) # ylim(시작값, 끝값) 으로 밸류값 조정 가능

# Bar굵기 및 x축 텍스트 기울기
plt.bar(labels, values, width=0.5)
plt.xticks(rotation=45) #축의 텍스트를 기울 수 있음
plt.yticks(rotation=45);

#x축에 들어갈 값 바꾸는 방법
ticks = ['No.1', 'No.2', 'No.3'] #번호
labels = ['Kang', 'Seo', 'Jung'] # 이름
values = [190, 187, 184] # 키

plt.bar(labels, values)
plt.xticks(labels,ticks);

 

 

▶ 막대그래프 심화

# 옆으로 누은 막대그래프
plt.barh(labels, values)
plt.xlim(175, 195) #값 조절

# 막대 꾸미기
bar = plt.bar(labels, values)
bar[0].set_hatch('/')
bar[1].set_hatch('x')
bar[2].set_hatch('..')

# 막대에 글자 넣기
bar = plt.bar(labels, values)
plt.ylim(175, 195)

for idx, rect in enumerate(bar):
    plt.text(idx, rect.get_height()+0.5, values[idx], ha='center', color='r')
  1. 꺾은선 그래프와 같이 텍스트를 넣는 형식의 개념은 같다 .text(x축, y축, 텍스트 값)
  2. 꺾은선과 다른 점은 막대 그래프가 꺾은선처럼 이어져서 표시가 되는게 아닌 하나의 막대가 하나의 정보를 표시하기때문에 x축은 idx를 받아서 각각의 막대 위치 0,1,2,3,4 표시
  3. 객체의 치수로 값을 표시하면 된다. 자세한 정보는 링크 참조(https://wikidocs.net/76945)
    즉 y축에 나올 값은 막대의 치수 = 막대의 정보 이므로 치수를 원하는것을 들고 오면 된다.
  4. 아래 사진을 보면 왜 .get_height()이 되는지 알 수 있다.
  5. 구글링을 좀 해보면 어떤 사람들은 x축의 값도 x좌표를 정확히 구한뒤 계산을 하는 방식을 쓰는데 더 어렵다. 그냥 인덱싱으로 위치를 잡아주면 알아서 들어간다.