matplolib/기본&입문

음수부호 표기가 잘 안되면? 이렇게 해결하자!

JackSmith 2024. 5. 18.

계측공학 문제를 파이썬 코드로 접근해서 풀려고 하다가 다음과 같은 문제가 생겼다. 일단 코드를 보면 이렇다.

 

 

이런 오류는 처음본다;ㄷㄷ;;

찾아보니 Matplotlib이라는 패키지는 기본적으로 '-'(마이너스 부호)에 대한 표기에 있어서 제대로 출력되지 않는 고질적인 문제가 있다고 한다.

 

그래서 아래와 같은 오류를 종종 출력한다고 한다.

UserWarning: Glyph 8722 (\N{MINUS SIGN}) missing from current font.

 

 

이럴 때에는 여느때처럼 matplotlib.pyplot를 임포트하고 나서 아래 코드를 추가하면 된다고 한다.

plt.rcParams['axes.unicode_minus'] = False

 

 

나는 import구문 바로 아래에 아래와 같이 코드를 넣어주었다.

 

그 결과는 다음과 같다.

 

matplotlib은 엄청 유명한 패키지 라이브러리인데, 가끔 가다가 한가지씩 아쉬운 점이 종종 있다. (한글폰트가 깨지는 것도 수동으로 잡아주어야 하고 말이다. 웅웅)

 

내가 작성한 전체 코드는 다음과 같다.

 

1.함수로직 생성 및 파라미터값 설정 코드

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['axes.unicode_minus'] = False
plt.rc('font', family='Malgun Gothic')

# 주파수 응답과 위상 지연 데이터를 함수로 정의
def gain(f):
    if f == 1000:
        return 280
    elif f == 2000:
        return 220
    # 고조파가 추가될 경우 여기서 이득을 정의할 수 있습니다.
    return 1

def phase_lag(f):
    if f == 1000:
        return 0
    elif f == 2000:
        return 20 * (np.pi / 180)  # degrees to radians
    # 고조파가 추가될 경우 여기서 위상 지연을 정의할 수 있습니다.
    return 0

# 사각파 생성
def square_wave(t, f):
    return (4 / np.pi) * np.sum([np.sin(2 * np.pi * (2*n-1) * f * t) / (2*n-1) for n in range(1, 10)], axis=0)

# 시간 설정
fs = 100000  # 샘플링 주파수
T = 0.002    # 신호 지속 시간
t = np.linspace(0, T, int(fs*T), endpoint=False)

# 입력 사각파 생성
f1 = 1000  # 기본 주파수
input_signal = square_wave(t, f1)

# 출력 신호 계산
output_signal = np.zeros_like(t)
for harmonic in [1, 2]:  # 1000 Hz와 2000 Hz 성분을 고려
    f_h = harmonic * f1
    g = gain(f_h)
    phi = phase_lag(f_h)
    output_signal += g * (4 / np.pi) * np.sin(2 * np.pi * f_h * t + phi) / harmonic

 

 

2.위 코드를 기반으로 한 시각화 코드

# 시각화
plt.figure(figsize=(12, 6))

plt.subplot(2, 1, 1)
plt.plot(t, input_signal, label='입력 사각파')
plt.title('입력 사각파 (1000 Hz 기본 주파수)')
plt.xlabel('시간 (s)')
plt.ylabel('진폭')
plt.grid(True)
plt.legend()

plt.subplot(2, 1, 2)
plt.plot(t, output_signal, label='출력 신호', color='orange')
plt.title('출력 신호 (증폭기 이득 및 위상 지연 적용)')
plt.xlabel('시간 (s)')
plt.ylabel('진폭')
plt.grid(True)
plt.legend()

plt.tight_layout()
plt.show()

 

 

댓글