[seaborn] 스타일 사용자 정의 (set_style, set_context)

  • 시각화

본 포스팅에서는 seaborn의 set_style, set_context를 활용해 시각화된 자료를 세부적으로 스타일링 하는 방법을 소개한다.

들어가기에 앞서

데이터 시각화, 스타일링이 중요한 이유

데이터 시각화의 목표는 데이터에서 발견한 통찰력을 전달하는 거다. 이때 어떤 스타일로 시각화하는지에 따라 잠재 고객이 내용을 이해하는 방식이 달라질 수 있다.

그래서 일단 데이터를 잘 가공하고, 그것을 시각화 한 후, 마지막 단계에서는 스타일링이 필요하다. 스타일링은 그림의 전반적인 모양을 사용자가 상세히 정의하는 프로세스라고 보면 된다. 시각화된 자료의 세부 사항을 작업자가 의도적으로 결정할수록 그 자료의 영향력이 커지고 차별화 될 거다.

Seaborn으로 스타일링

seaborn에서 스타일링 할 때 크게 두 차원으로 생각해볼 수 있다.

  1. set_style: background color, grid, spine, tick을 정의하여 그림의 전반적인 모양을 스타일링
  2. set_context: 프리젠테이션이나 보고서와 같은 다양한 매체에 활용할 수 있도록 스타일링

1. set_style: 그림의 전반적인 모양 스타일링

그림을 꾸밀 때는 이 그림을 보는 사람이 누구인지, 어떤 상황에서 제시되는지 고려해야 한다.

시각화가 보고서의 일부로 사용되며 특정 정보만을 전달하는가, 아니면 프레젠테이션의 일부인가, 아니면 시각화가 앞뒤 맥락 없이 독립적으로 제시되는가.

*** Built-in Themes (내장 테마) 활용하기

Seaborn에는 5가지 기본 제공 테마가 있다. darkgridwhitegriddarkwhite, ticks. 기본값은 darkgrid이지만, 원하는대로 변경이 가능하다.

테마를 사용하려면 sns.set_style()로 지정하면 된다.

sns.set_style("darkgrid")
sns.stripplot(x="day", y="total_bill", data=tips)

쉽다. 이제 좀 더 구체적으로 살펴보자.

1) Background Color (배경색)

플롯의 배경색은 중요하다. 플롯의 색과 배경색의 대비가 클수록 시각화가 더 잘 보이기 때문이다.
(*** 토막 상식: 흰색 배경에는 검은색보다 진한 파란색이 더 읽기 쉽다!)

dark인지 sns.set_style("dark"), white인지 sns.set_style("white") 선택하면 된다.

2) Grid (그리드)

차트를 읽고 특정 값에 대한 정보를 얻도록 하려면 그리드를 포함하는 게 좋다.

whitegrid를 사용하면 이렇게 나타난다.

sns.set_style("whitegrid")
sns.stripplot(x="day", y="total_bill", data=tips)

그리드를 사용하지 않고 그냥 white로만 지정하면 이렇게 나타난다.

sns.set_style("white")
sns.stripplot(x="day", y="total_bill", data=tips)

그러나 그리드를 사용하지 않는 것이 더 합리적일 때도 많다.

예를 들면 프리젠테이션 할 때는 세부 사항에 주의를 기울이기 보다는 중요한 메시지에 시선이 집중되어야 하기 때문에 차트를 단순화하는 게 좋을 수도 있다. 디자인 관점에서도 그렇고. (난 개인적으로 그리드를 별로 안 좋아한다. 불필요하게 많이 사용되고 있다고 생각한다.)

3) Despine (축/테두리 제거)

색상 변경 외에도 spine(축/테두리)을 직접 정의할 수도 있다. spine은 축이라고도 볼 수 있지만, 그림의 경계, 즉 테두리를 의미하기도 한다.

기본값은 네 개의 spine이 모두 있는 거다. left, right, top, bottom.

일부러 테두리를 제거해주는 게 깔끔할 수도 있다. plot을 지정한 후, 그 뒤에 sns.despine()이라고 지정하면 테두리를 제거한다. 아무것도 넣지 않으면 기본적으로 top, right 두 개를 제거해준다.

이렇게

sns.set_style("white")
sns.stripplot(x="day", y="total_bill", data=tips)
sns.despine()

만약 왼쪽, 하단의 테두리도 모두 제거하려면 이렇게 하면 될 거다.

sns.set_style("whitegrid")
sns.stripplot(x="day", y="total_bill", data=tips)
sns.despine(left=True, bottom=True)

2. set_context: 다양한 매체에 활용할 수 있도록 스타일링

matplotlib를 사용하면 플롯을 생성할 수는 있지만 프리젠테이션 목적으로 다양하게 스타일링하는 건 어렵다. 그러나 seaborn은 이걸 쉽게 해낼 수 있다. sns.set_context() 이것만 해주면 된다. seaborn 만세!

그러나 세 가지 수준의 복잡성을 고려해야 한다.

  1. Pass in one parameter that adjusts the scale of the plot
  2. Pass in two parameters – one for the scale and the other for the font size
  3. Pass in three parameters – including the previous two, as well as the rc with the style parameter that you want to override

1) 전체 스케일 조정

sns.set_context() 안에 총 4종류의 스케일(사이즈)를 선택할 수 있다. papernotebooktalk, poster. 여기서 기본값은 notebook이다.

가장 작은 스케일 paper로 그리면 이렇게

sns.set_style("ticks")

sns.set_context("paper")
sns.stripplot(x="day", y="total_bill", data=tips)

가장 큰 스케일 poster로 그리면 이렇게

sns.set_style("ticks")

sns.set_context("poster")
sns.stripplot(x="day", y="total_bill", data=tips)

보다시피 글씨가 큼직큼직해진다.

2) 폰트 사이즈 조정

스케일로도 전반적인 사이즈를 조정할 수 있지만 실제 폰트 크기를 조정하는 파라미터는 별도로 있다.

sns.set_context() 안에 font_scale을 넣어주면 된다. 이렇게

sns.set_context("poster", font_scale = .5)
sns.stripplot(x="day", y="total_bill", data=tips)

3) RC 파라미터로 세부 조정

만약 디테일하게 조정하고 싶다! 이 경우에는 sns.set_context() 안에 rc 파라미터를 딕셔너리 형태로 넣어주면 된다. 여기서 rc는 ‘run command’의 약자다.

예를 들어 그리드(눈금선)의 너비를 조정하고 싶다고 하면 rc={"grid.linewidth": 5} 이렇게 넣어주면 된다.

sns.set_context("poster", font_scale = 1, rc={"grid.linewidth": 5})
sns.stripplot(x="day", y="total_bill", data=tips)

함부로 만지면 괜히 이상해질 수 있다. (역시 default가 짱이야.)

사용할 수 있는 rc 파라미터는 다음과 같다.

{'axes.labelsize': 17.6,
 'axes.titlesize': 19.200000000000003,
 'font.size': 19.200000000000003,
 'grid.linewidth': 1.6,
 'legend.fontsize': 16.0,
 'lines.linewidth': 2.8000000000000003,
 'lines.markeredgewidth': 0.0,
 'lines.markersize': 11.200000000000001,
 'patch.linewidth': 0.48,
 'xtick.labelsize': 16.0,
 'xtick.major.pad': 11.200000000000001,
 'xtick.major.width': 1.6,
 'xtick.minor.width': 0.8,
 'ytick.labelsize': 16.0,
 'ytick.major.pad': 11.200000000000001,
 'ytick.major.width': 1.6,
 'ytick.minor.width': 0.8}

결론

seaborn은 플롯을 디테일하게 정의할 수 있는 다양한 옵션을 제공한다. 배경색, 선 및 눈금 등의 배경 스타일뿐만 아니라 글꼴 크기 같은 걸 잘 조정하면 가독성도 좋아지고 예뻐진다. 열심히 만져보자.

추천 글

댓글 남기기