-
Line plotCS 공부/Data Visualization 2023. 3. 26. 17:02
Line plot
- 연속적으로 변화하는 값을 순서대로 점으로 나타내고, 이를 선으로 연결한 그래프
- 꺾은선 그래프, 선 그래프, line chart, line graph
- 시계열 분석에 특화됨! (시간/순서에 대한 변화)
- .plot() (.line아님!!)
- 5개 이하의 선을 사용하는 것을 추천
- 시시각각 변동하는 데이터는 noise로 인해 추세 파악이 어려워서 noise 방해를 줄이기 위해 smoothing 사용
- 규칙적인 간격의 데이터가 아니라면 각 관측 값에 점으로 표시해서 오해를 줄이자!
- 범례 대신 라인 끝 단에 레이블을 추가하는 것을 추천!
- Min/Max 정보나 원하는 포인트는 annotation을 추가해주는 것이 도움 됨
- 보다 연한 색을 사용하여 uncertainty(신뢰구간, 분산 등) 표현 가능
Line plot 요소
- 색상: color
- 마커: marker, markersize
- 선의 종류: linestyle, linewidth
보간: 점과 점 사이 잇는 것
- 없는 데이터를 있다고 생각하게 할 수 있으며 작은 차이를 없앨 수 있어 일반적인 분석에서는 지양할 것!
- smoothing 방법
- scipy.interpolate.make_interp_spline()
- scipy.interpolate.interp1d()
- scipy.ndimage.gaussian_filter1d()
이중 축 사용: 한 plot에 대해 2개의 축 사용
- .twinx(): 같은 축에 대해 서로 다른 종류의 데이터 표현
- .secondary_xaxis(), .secondary_yaxis(): 한 데이터에 대해 단위가 다를 때
- 이중 축은 지양할 것
Line plot 코드
fig, axes = plt.subplots(1, 2, figsize=(12, 7)) # x축은 정렬이 되어있어야함 x1 = [1, 2, 3, 4, 5] x2 = [1, 3, 2, 4, 5] y = [1, 3, 2, 1, 5] axes[0].plot(x1, y) axes[1].plot(x2, y) plt.show()
x2=[1,3,2,4,5]가 되면 그래프가 망가짐 # 도형그리기도 가능 fig = plt.figure(figsize=(5, 5)) ax = fig.add_subplot(111, aspect=1) n = 1000 # n=4일때 삼각형 5면 사각형 ....1000이면 원처럼 보임 x = np.sin(np.linspace(0, 2*np.pi, n)) y = np.cos(np.linspace(0, 2*np.pi, n)) ax.plot(x, y) plt.show()
fig, ax = plt.subplots(1, 1, figsize=(5, 5)) np.random.seed(97) x = np.arange(7) y = np.random.rand(7) ax.plot(x, y, color='black', #색깔 설정 marker='o', # 점의 모양 (*,^,. 등) linestyle='dotted', #solid, dotted, dashed 등... ) plt.show()
이동 평균 사용하기 (smoothing)
#pandas의 rolling 함수 사용 google_rolling = google.rolling(window=20).mean() #window=20 20개씩 평균을 보겠다, 평균을 내면 noise가 줄어들음 fig, axes = plt.subplots(2, 1, figsize=(12, 7), dpi=300, sharex=True) #dpi=해상도 axes[0].plot(google.index,google['close']) axes[1].plot(google_rolling.index,google_rolling['close']) plt.show()
원래 그래프와 smoothing 해준 그래프 비교 보간 (smoothing2)
from scipy.interpolate import make_interp_spline, interp1d import matplotlib.dates as dates fig, ax = plt.subplots(1, 2, figsize=(20, 7), dpi=300) date_np = google.index value_np = google['close'] date_num = dates.date2num(date_np) # smooth date_num_smooth = np.linspace(date_num.min(), date_num.max(), 50) spl = make_interp_spline(date_num, value_np, k=3) # 부드러운 곡선 만들기 value_np_smooth = spl(date_num_smooth) # print ax[0].plot(date_np, value_np) # 원래 그래프 ax[1].plot(dates.num2date(date_num_smooth), value_np_smooth) # smoothing한 그래프 plt.show()
필요에 따른 그래프 선택
from matplotlib.ticker import MultipleLocator fig = plt.figure(figsize=(12, 5)) np.random.seed(970725) x = np.arange(20) y = np.random.rand(20) #랜덤 y # Ax1-정확한 정보를 남기고 싶다! ax1 = fig.add_subplot(121) ax1.plot(x, y, marker='o', linewidth=2) ax1.xaxis.set_major_locator(MultipleLocator(1)) #x축 1단위 그리드 ax1.yaxis.set_major_locator(MultipleLocator(0.05)) #y축 0.05단위 그리드 ax1.grid(linewidth=0.3) # Ax2- 추세를 보고싶다 ax2 = fig.add_subplot(122) ax2.plot(x, y, linewidth=2,) ax2.spines['top'].set_visible(False) #위, 오른쪽 선 안보이게 ax2.spines['right'].set_visible(False) ax1.set_title(f"Line Plot (information)", loc='left', fontsize=12, va= 'bottom', fontweight='semibold') ax2.set_title(f"Line Plot (clean)", loc='left', fontsize=12, va= 'bottom', fontweight='semibold') plt.show()
왼: 정확한 정보 보고 싶을 때, 오: 추세 보고 싶을 때 이중축 사용
fig, ax1 = plt.subplots(figsize=(12, 7), dpi=150) color = 'royalblue' ax1.plot(google.index, google['close'], color=color) ax1.set_xlabel('date') ax1.set_ylabel('close price', color=color) ax1.tick_params(axis='y', labelcolor=color) ax2 = ax1.twinx() #같은 x축 date에 대해 다른 정보를 사용할 때 color = 'tomato' ax2.plot(google.index, google['volume'], color=color) ax2.set_ylabel('volume', color=color) ax2.tick_params(axis='y', labelcolor=color) ax1.set_title('Google Close Price & Volume', loc='left', fontsize=15) plt.show()
def deg2rad(x): return x * np.pi / 180 def rad2deg(x): return x * 180 / np.pi fig, ax = plt.subplots() x = np.arange(0, 360) y = np.sin(2 * x * np.pi / 180) ax.plot(x, y) ax.set_xlabel('angle [degrees]') ax.set_ylabel('signal') ax.set_title('Sine wave') secax = ax.secondary_xaxis('top', functions=(deg2rad, rad2deg)) #한 데이터에 대해 단위가 다를 때, 각도를 라디안으로 바꾸기 secax.set_xlabel('angle [rad]') plt.show()
그외...
#annotation 박스 그리기 ax.text(x[-1]+0.1, y1[-1], s='sin', fontweight='bold', #글자=sin, bold(진하게) va='center', ha='left', bbox=dict(boxstyle='round,pad=0.3', fc='#1ABDE9', ec='black', alpha=0.3)) #박스 크기 색깔 투명도 #최대값 강조하기 ax.plot([-1, x[np.argmax(y)]], [np.max(y)]*2, #-1부터 max값 까지 x축과 평행하게 그리기 linestyle='--', color='tomato' )
'CS 공부 > Data Visualization' 카테고리의 다른 글
Matplotlib 시각화 요소 (Text, Color, Facet) (0) 2023.03.27 Scatter plot (0) 2023.03.26 Bar plot (0) 2023.03.25 Matplotlib 기초 (그래프 틀, 막대그래프 그리기, annotate) (0) 2023.03.24 데이터 시각화 (0) 2023.03.23