ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Line plot
    CS 공부/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
Designed by Tistory.