heatmap에 사선 (hatch) 추가 (python, matplotlib)

소개



히트 맵상에서 특정의 값을 나타내는 부분에 사선('/')을 그리고 싶었으므로, 메모.

하고 싶은 일



다음과 같은 히트 맵에서 특정 값의 부분을 사선으로 좋은 느낌으로 하고 싶다.
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(0)
Z =np.random.rand(10, 10)
Zm = Z * 0
Z[3:5, 5:8] = 1
fig, ax = plt.subplots(figsize=(9, 7))
ax1 = ax.pcolormesh(Z)
fig.colorbar(ax1)



위의 그림에서 Z[3:5, 5:8] = 1는 그림의 일부 값을 1로 설정합니다.
Z[3:5, 5:8] 부분에 사선을 그립니다.

해결 방법



최종 코드는 다음과 같습니다.
np.random.seed(0)
Z =np.random.rand(10, 10)
Zm = Z * 0
Z[3:5, 5:8] = 1
fig, ax = plt.subplots(figsize=(9, 7))
ax1 = ax.pcolormesh(Z)

Zm = np.ma.masked_where(Z!=1, Z)
ax2 = ax.pcolor(Zm, hatch='/', edgecolor='grey',facecolor='none', linewidth=0.0)

fig.colorbar(ax1)



무엇을 하고 있는가



위의 코드에서 처음과 다른 것은 다음 두 줄입니다.
Zm = np.ma.masked_where(Z!=1, Z)
ax2 = ax.pcolor(Zm, hatch='/', edgecolor='grey',facecolor='none', linewidth=0.0)

첫 번째 행: 행렬 마스크



부분만 사선으로 나타내기 위해 코드의 1행째로 그 부분을 나타내는 행렬(Zm)을 작성하고 있습니다.
numpy.ma.masked_where를 사용하면 조건에 해당하는 부분이 무효화 된 (마스킹 된) 행렬을 만들 수 있습니다.
참고: numpy.ma.masked_where 공식 문서

원래 행렬 (Z)과 마스크 된 행렬 (Zm)은 다음과 같습니다.




행렬의 내용을 보면 Zm에서는 조건식 (Z!=1)에 해당하는 요소 이외는 --로 표현됩니다.
플롯 할 때이 행렬 Zm을 사용하여 조건식에 해당하는 부분을 무시하고 플롯을 수행 할 수 있습니다.

두 번째 줄: 해치로 사선을 그립니다.



참고: python – matplotlib 2.0에서 영역을 해치 전용 (배경색 없음)으로 채우려면 어떻게해야합니까?

코드의 두 번째 행에서는 행렬 Zm을 사용하여 사선을 그립니다.matplotlib.pyplot.pcolor에서는 다음 패턴의 해치를 사용할 수 있습니다.

/- diagonal hatching
\- back diagonal
|- vertical
- - horizontal
+ - crossed
x - crossed diagonal
o - 작은 circle
O - 대형 circle
.- dots
* - stars

참고: matplotlib.collections.Collection.set_hatch

여기에서 사용한 옵션은 다음과 같습니다.
  • edgecolor :hatch 의 색
  • facecolor : hatch의 배경색. 'none'으로 설정하면 히트 맵의 색상을 남기고 hatch 만 표시 할 수 있습니다.
  • linewidth : 그리드의 두께. 0보다 큰 값을 지정하면 그리드가 표시됩니다.

  • 옵션을 변경했을 때의 그림의 외관은 다음과 같습니다.
    ( ax.pcolor 의 행 이외는 최종 코드와 같습니다)
    ax2 = ax.pcolor(Zm, hatch='/', edgecolor='grey',facecolor='none', linewidth=1.0)
    


    ax2 = ax.pcolor(Zm, hatch='/', edgecolor='grey',linewidth=0.0)
    


    ax2 = ax.pcolor(Zm, hatch='/', edgecolor='red',facecolor='none', linewidth=0.0)
    



    참고 사이트 일람



    numpy.ma.masked_where 공식 문서
    python – matplotlib 2.0에서 영역을 해치 전용 (배경색 없음)으로 채우려면 어떻게해야합니까?
    matplotlib.collections.Collection.set_hatch

    좋은 웹페이지 즐겨찾기