본문 바로가기
matplotlib, 너무 큰 데이터와 나머지 데이터를 위한 그래프 중간 물결 break (Snippet)

데이터를 보다 보면, 1개만 너무 커서 나머지 데이터가 잘 안 보이는 경우가 많이 있습니다. 보통 Softmax결과 같은 걸 볼 때 많이 불편한데, 어떤 식이냐면, 

# 데이터
y = [3.2884181e-08, 9.9934798e-01, 4.0284030e-07, 3.2888292e-06, 5.4231123e-06, 2.1904407e-09, 1.7653175e-08, 6.3124090e-04, 1.1334526e-05, 3.5927971e-07]

 

이런 식의 데이터인데 잘 보면 index=1일 때 값이 다른 값보다 너무나도 큽니다. 이걸 그냥 그려보면,

 

이런 식으로 보이거든요. 1 이외에는 어렵네요. 이런 경우에 1과 나머지 경우를 따로 분리해서 scaling을 하면 좋겠다고 생각이 드는 경우가 많을 텐데, 다음과 같이 처리하면 되겠습니다. 

# 데이터
y = [3.2884181e-08, 9.9934798e-01, 4.0284030e-07, 3.2888292e-06, 5.4231123e-06, 2.1904407e-09, 1.7653175e-08, 6.3124090e-04, 1.1334526e-05, 3.5927971e-07]

def plot_break_bar(y, top_y_range, bottom_y_range) :
    ''' y: 데이터 np.array 
        top_y_range: list [시작, 끝], 위쪽 그래프에 관한 것 
        botom_y_range: list [시작, 끝], 아래쪽 그래프에 관한 것 
        친절한 데이터 사이언티스트 되기 강좌의 Snippet
    '''
    # 그래프 두 개를 한 figure 내에 그리기
    fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True) 
    # 두 그래프 사이의 상하 간격 설정
    fig.subplots_adjust(hspace = 0.1) 

    # 각각의 그래프 그리기 ax1이 위, ax2가 아래 임
    ax1.bar(np.arange(len(y)),y)
    ax2.bar(np.arange(len(y)),y)

    ax1.set_ylim(top_y_range[0], top_y_range[1]) # 윗쪽 그래프 y축 범위 설정
    ax2.set_ylim(bottom_y_range[0], bottom_y_range[1]) # 아랫쪽 그래프 y축 범위 설정

    # 지수형태로 label을 쓰지 않기 - 작은 숫자 안보이니까 
    ax2.ticklabel_format(axis='y', style='plain')

    # 두 그래프 사이의 경계선 제거
    ax1.spines['bottom'].set_visible(False)
    ax2.spines['top'].set_visible(False)
    ax1.xaxis.tick_top()
    ax1.tick_params(labeltop=False)
    ax2.xaxis.tick_bottom()

    # 두 그래프 사이의 경계선 제거
    ax1.yaxis.grid()
    ax2.yaxis.grid()

    # 두 그래프 사이의 y축에 물결선 효과 마커 표시
    kwargs = dict(marker=[(-1, -0.5), (1, 0.5)], markersize=12,
                  linestyle="none", color='k', mec='k', mew=1, clip_on=False)
    ax1.plot([0, 1], [0, 0], transform=ax1.transAxes, **kwargs)
    ax2.plot([0, 1], [1, 1], transform=ax2.transAxes, **kwargs)

    plt.show()
    
plot_break_bar(y, [0.00005, 1.1], [0.0, 0.00005]) # 위쪽 0.0005~1, 아래쪽 0~0.0005로 그려주세욥

 

이 함수를 그대로 뜯어다가 사용하면 됩니다. 사용법은

# 데이터
y = [3.2884181e-08, 9.9934798e-01, 4.0284030e-07, 3.2888292e-06, 5.4231123e-06, 2.1904407e-09, 1.7653175e-08, 6.3124090e-04, 1.1334526e-05, 3.5927971e-07]

# 그려요... 
plot_break_bar(y, [0.00005, 1.1], [0.0, 0.00005])

 

이렇게 하면 결과는~ 두두두두두.

 

이런 식이 됩니다. 많이 복잡하니까, 그냥 함수롤 뜯어다가 쓰면 좋겠습니다. 후후.

이런 식의 snippet을 많이 만들어 두면 좋겠는데, 그러려면 많이 부지런해야 하겠습니다. 음.

친절한 데이터 사이언스 강좌 글 전체 목차 (정주행 링크) -



댓글





친절한 데이터 사이언스 강좌 글 전체 목차 (정주행 링크) -