티스토리 뷰

 

 

Project : Py_EX

Python file : EX02_sineplot.py (이어서)

IDE : PyCharm [설치방법]

 

 

이전 글 참조

 

[Python] 사인함수 그래프 그려보기

이전글 참조 : 2020/09/05 - [Engineering/Python] - [Python] 사인함수(삼각함수) 사용해보기 Project : Py_EX Python file : EX02_sineplot.py 사인함수를 사용해 보았으니 이번에는 그래프를 그려보자. 위키피..

generalbulldog.tistory.com

 

이전 글에서 사인함수 그래프를 그려보았는데, 모양새가 썩 맘에 들지 않아서 오늘은 그래프의 폼을 조금 잡아보려고 한다. 배우는 단계에서 기능을 모두 사용해 보는 것은 너무 오래 걸리기도 하고 시간낭비라고 생각한다. 나도 모든 기능을 다 알지도 못할 뿐더러 안다고 해도 오래 외우지도 못하고 있을 것 뻔 하며, 필요한 기능은 필요할 때 그때그때 찾아보고 사용하면 된다는 주의라서, 이번에도 그래프를 그릴 때 참조한 위키피디아 그래프와 비슷하게 바꿔보는 선에서 사용법만 간단히 익혀보자. 다시 말하지만 개인적으로 더 필요한 기능이 있다면 찾아서 사용해 보면서 익히는 것이 제일 좋다.

 

오늘은 왼쪽 그래프를 오른쪽 그래프 처럼 만들어보자

 

## 선 색깔, 두께 변경

# setp

 

선 색을 빨간색으로, 조금 더 두껍게 변경해 보자. 이전 글에서 작성했던 코딩에서  plot 을 임의의 변수(lines)에 저장하고  setp 함수를 이용하여 변수에 저장된 그래프에 옵션을 주는 형식이다. 역시, matlab과 사용 방식이 유사하다. 

 

import numpy as np
from matplotlib import pyplot as plt

start = 0
end = 2 * np.pi
dx = 1000
x = np.linspace(start, end, dx)

lines = plt.plot(x, np.sin(x))
plt.setp(lines, 'color', 'r', 'linewidth', 2.0)

 

이런 식으로 그래프에 옵션을 부여할 수가 있다. 결과는 아래와 같다. 참고로 이 외에도 선 색을 바꿀 수 있는 여러가지 방법이 있으며, 여기서 사용한 것은 내가 matlab에서 가장 많이 사용하던 방식과 같아서 사용한 것이다.   plot(x, y, color='red', linewidth=2.0)  처럼  plot 에 바로 옵션을 주어도 같은 결과를 얻을 수 있고, 이외 또 다른 여러가지 형식들로 옵션을 지정할 수 있다. 쓰고보니 위 방식이 더 나은것 같아. 다음부턴  plot 에 바로 옵션을 주는 방식으로 써야겠다. 이처럼 본인에게 가장 편한놈으로 하나 정해서 사용하면 되겠다. 어쨌든 결과는 같으니깐.

 

선 색과 두께가 원하는 옵션으로 변경된 것을 확인

 

 

## 눈금선 생성

# grid

 

위 코드에서 제일 아래에 한 줄 추가하자. 간단하게 결과를 출력해 볼 수 있다.

plt.grid(True)

 

눈금선 출력 확인

 

## X, Y축 단위 변경

# xtick, ytick

 

그래프의 단위를 0에서 6까지 7개로 쪼개진 것이 아닌, 0에서 2π까지 9개로 쪼개진 단위로 변경해보자. 위 코드의 아래에 또 아래의 두 줄을 추가해서 실행해보자.

xticks_array = np.linspace(0, 2*np.pi, 9)
plt.xticks(xticks_array)
plt.yticks([-1, -1/2, 0, 1/2, 1])

단위가 바뀌긴 했는데

 

단위가 소수점으로 나와서 썩 마음에 들지 않는다. 위키피디아 그래프 처럼 깔끔하게 정수, 분수로 나오게 하려면 조금 더 마음에 들지 않는 방법을 사용해야 하는데, 좀 더 깔끔한 방법이 있다면 소개 부탁드린다. 어쨌든 깔끔하지 않더라도 목적을 위해 위 코드를 아래와 같이 바꿔보자.

 

plt.xticks(xticks_array, [r'$0$', r'$1/4\pi$', r'$1/2\pi$', r'$3/4\pi$', r'$\pi$', r'$5/4\pi$', r'$3/2\pi$', r'$7/4\pi$', r'$2\pi$'])
plt.yticks([-1, -1/2, 0, 1/2, 1], ['-1', '-1/2', '0', '1/2', '1'])

 

방법은 마음에 들지 않지만 결과는 괜찮다

 

X축과 Y축의 범위가 일단은 깔끔하게 바뀌었다. (분수 표현은 어떻게 하는지 모르겠다)

 

 

## 그래프 범위 변경

# xlim, ylim

 

그래프의 X, Y축 범위가 딱 떨어지게 바꿔보자. 위키피디아 그래프와는 조금 차이가 있지만 그래도 일단 진행. 

plt.xlim([0, 2 * np.pi])
plt.ylim([-1.3, 1.3])

축 범위 변경 확인

 

## 그래프 크기 변경

# figure(figsize)

 

위키피디아의 그래프는 납작하다. 그리고 나서 마우스 드래그로 크기를 변경해도 되지만, 그렇게 되면 할 때마다 같은 사이즈로 만들기가 어렵다. 또한 레포트에 그림으로 붙여넣기를 했다면 사이즈 변경 시 글자의 비율도 멍청이가 되어버리는 사태를 맞이할 수 있다. 이를 피해보기 위해 출력되는 그래프의 사이즈를 조정하고 싶다면  plot 의 윗줄에 다음 코드를 추가해보자. 여기에서 사이즈 (7.5, 2.6)은 대충 몇 번 해봐서 위키피디아 그래프와 크기비율을 맞추어 본 것이니 큰 의미는 없다. 

plt.figure(figsize=(7.5, 2.6))

 

그래프 사이즈 변경

 

 

## 중간 점검

 

일단 여기까지 하고 타겟이랑 비교 한번 해보자.

Object(왼), Target(오)

 

목표하는 그래프 모양이 납작해서 나도 납작하게 만들었다. X축 위치와, 축 방향표시, 축 이름이 빠졌지만 나름 비슷하다. 

 

 

 

## X축 위치 변경 및 프레임(뼈대) 제거

# ax = plt.gca(), spines, xaxis, yaxis

 

조금 더 비슷하게 따라가 보자. X축의 위치를 Y축의 0의 위치에 가져도 놓고, 아래/위/오른쪽의 프레임도 제거해보자.

 

ax = plt.gca()                              # 현재의 Axes를 가져온다

ax.spines['right'].set_visible(False)       # 오른쪽 뼈대 제거
ax.spines['top'].set_visible(False)         # 위쪽 뼈대 제거
ax.spines['left'].set_position('zero')      # 왼쪽 뼈대를 X축의 0에 위치 (이 예제에서는 안해도 됨)
ax.spines['bottom'].set_position('zero')    # 아래쪽 뼈대를 Y축의 0에 위치
ax.xaxis.set_ticks_position('bottom')       # 아래쪽 뼈대를 X축으로 설정
ax.yaxis.set_ticks_position('left')         # 왼쪽 뼈대를 Y축으로 설정 (이 예제에서는 안해도 됨)

X축 위치 변경, 프레임 제거

 

 

 


# 전체 코드

import numpy as np
from matplotlib import pyplot as plt


# 데이터 생성
start = 0
end = 2 * np.pi
dx = 1000
x = np.linspace(start, end, dx)

# 그래프 그리기
plt.figure(figsize=(7.5, 2.6))                      # 그래프 크기를 설정
lines = plt.plot(x, np.sin(x))                      # 데이터로 그래프를 그림
plt.setp(lines, 'color', 'r', 'linewidth', 2.0)     # 그래프의 색과 두께를 변경
plt.grid(True)                                      # 그래프 격자 생성
x_array = np.linspace(0, 2 * np.pi, 9)              # x축 단위로 사용할 데이터 생성
plt.xticks(x_array,
           [r'$0$', r'$1/4\pi$', r'$1/2\pi$', r'$3/4\pi$', r'$\pi$'
               , r'$5/4\pi$', r'$3/2\pi$', r'$7/4\pi$', r'$2\pi$'])     # x축 단위 변경
plt.yticks([-1, -1 / 2, 0, 1 / 2, 1], ['-1', '-1/2', '0', '1/2', '1'])  # y축 단위 변경
plt.xlim([0, 2 * np.pi])                            # x축 범위 변경
plt.ylim([-1.3, 1.3])                               # y축 범위 변경

ax = plt.gca()                              # 현재의 Axes를 가져온다

ax.spines['right'].set_visible(False)       # 오른쪽 뼈대 제거
ax.spines['top'].set_visible(False)         # 위쪽 뼈대 제거
ax.spines['left'].set_position('zero')      # 왼쪽 뼈대를 X축의 0에 위치 (이 예제에서는 안해도 됨)
ax.spines['bottom'].set_position('zero')    # 아래쪽 뼈대를 Y축의 0에 위치
ax.xaxis.set_ticks_position('bottom')       # 아래쪽 뼈대를 X축으로 설정
ax.yaxis.set_ticks_position('left')         # 왼쪽 뼈대를 Y축으로 설정 (이 예제에서는 안해도 됨)
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함