데이터를 보다 보면, 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을 많이 만들어 두면 좋겠는데, 그러려면 많이 부지런해야 하겠습니다. 음.
댓글