히트 맵의 세 번째 축 (색상)을 사용자 정의하는 방법 (N 번 달임)
12555 단어 Python3matplotlib
소개
데이터의 경향을 여러 관점에서 가시화하는 데 있어서, 히트 맵은 편리하네요.
matplotlib에도 데이터를 흘려 넣으면, 좋게 히트 맵을 생성해 주는 pcolor 메소드가 있습니다. 이것은 이것으로, 파파와 가시화하고 싶을 때에는 편리합니다만, 데이터의 집계로부터 가시화까지가 세트가 되어 버리고 있으므로, 3축째(색)에 빈도 이외의 값이나, 스스로 집계한 값을 이용 원하는 경우에는 사용할 수 없습니다.
이럴 때 matplotlib의 imshow를 이용하면 아래와 같은 3축째(색)를 커스텀한 히트 맵이 걸려 조금 편리합니다. (아래는 레인지마다의 빈도가 아니고, 합을 3축째(색)으로 취한 예입니다.)
구현
여기에서는 3개의 연속 변수 중 2개의 연속 변수를 빈으로 단락지어, 각 빈마다 남은 연속 변수의 통계량을 히트 맵으로 표현하는 예를 나타냅니다.
아래 순서로 설명합니다.
1. 데이터 세트 생성
2. 데이터 세트의 빈 자르기
3. 히트맵 생성
1. 데이터 세트 생성
우선, 3연속 변수의 데이터 세트를 정규 분포로부터 샘플링해 작성합니다. 단봉 분포라고 가시화했을 때에 빛나지 않았기 때문에, 2봉 분포로 해 보았습니다. 2봉 분포의 모수는 각각(평균, 표준편차)=(50, 10), (100, 10)로 하고, 샘플수를 200,000건으로 하고 있습니다.
import pandas as pd
import numpy as np
def create_2peak_distribution(mean1, std1, mean2, std2, size):
dist_1 = np.random.normal(mean1, std1, size)
dist_2 = np.random.normal(mean2, std2, size)
dist = np.concatenate([dist_1, dist_2]).reshape(size * 2, 1)
return dist
#母数などの設定値
mean1 = 50
mean2 = 100
std1 = 10
std2 = 10
size = 100000
#各連続変数のデータ生成
cont_var1 = create_2peak_distribution(mean1, std1, mean2, std2, size)
cont_var2 = create_2peak_distribution(mean1, std1, mean2, std2, size)
cont_var3 = create_2peak_distribution(mean1, std1, mean2, std2, size)
#連続変数を1つのデータフレームにまとめる
arr = np.concatenate([cont_var1, cont_var2, cont_var3], axis=1)
df = pd.DataFrame(dat, columns=['cont_var1', 'cont_var2', 'cont_var3'], dtype=int)
2. 데이터 세트의 빈 절단 및 데이터 집계
그런 다음 1에서 생성된 데이터 세트 중 두 개의 연속 변수를 빈으로 분할하고 데이터를 각 빈의 입도로 집계합니다. 이번 집계는 정교한 것은 아니고, 화를 취하는 것만으로 하고 있습니다만, 여러가지 할 수 있을 것입니다. 흥미가 있는 분은 꼭 시험해 보세요.
덧붙여 빈의 수는 스타 제스의 공식으로 산출한 값을 참고로 하고 있습니다.
import math
def get_bin_count(size):
return round(1 + math.log2(size))
def create_bins(df, col, bin_count):
bin_width = df[col].max() // bin_count
df[col] = (df[col] // bin_width) * bin_width
return df
# 連続変数のビン分割
bin_count = get_bin_count(df.shape[0])
df = create_bins(df, 'cont_var1', bin_count)
df = create_bins(df, 'cont_var2', bin_count)
# ビンごとに残った連続変数の集計
heatmap_input = pd.pivot_table(df, index='cont_var1', columns='cont_var2', values='cont_var3', aggfunc=np.sum).fillna(0)
3. 히트맵 생성
마지막으로 imshow를 사용하여 2의 집계 결과를 플로팅합니다.
플롯 할 때는 아래에주의하면 혼란이 적다고 생각합니다.
여기에서는 3개의 연속 변수 중 2개의 연속 변수를 빈으로 단락지어, 각 빈마다 남은 연속 변수의 통계량을 히트 맵으로 표현하는 예를 나타냅니다.
아래 순서로 설명합니다.
1. 데이터 세트 생성
2. 데이터 세트의 빈 자르기
3. 히트맵 생성
1. 데이터 세트 생성
우선, 3연속 변수의 데이터 세트를 정규 분포로부터 샘플링해 작성합니다. 단봉 분포라고 가시화했을 때에 빛나지 않았기 때문에, 2봉 분포로 해 보았습니다. 2봉 분포의 모수는 각각(평균, 표준편차)=(50, 10), (100, 10)로 하고, 샘플수를 200,000건으로 하고 있습니다.
import pandas as pd
import numpy as np
def create_2peak_distribution(mean1, std1, mean2, std2, size):
dist_1 = np.random.normal(mean1, std1, size)
dist_2 = np.random.normal(mean2, std2, size)
dist = np.concatenate([dist_1, dist_2]).reshape(size * 2, 1)
return dist
#母数などの設定値
mean1 = 50
mean2 = 100
std1 = 10
std2 = 10
size = 100000
#各連続変数のデータ生成
cont_var1 = create_2peak_distribution(mean1, std1, mean2, std2, size)
cont_var2 = create_2peak_distribution(mean1, std1, mean2, std2, size)
cont_var3 = create_2peak_distribution(mean1, std1, mean2, std2, size)
#連続変数を1つのデータフレームにまとめる
arr = np.concatenate([cont_var1, cont_var2, cont_var3], axis=1)
df = pd.DataFrame(dat, columns=['cont_var1', 'cont_var2', 'cont_var3'], dtype=int)
2. 데이터 세트의 빈 절단 및 데이터 집계
그런 다음 1에서 생성된 데이터 세트 중 두 개의 연속 변수를 빈으로 분할하고 데이터를 각 빈의 입도로 집계합니다. 이번 집계는 정교한 것은 아니고, 화를 취하는 것만으로 하고 있습니다만, 여러가지 할 수 있을 것입니다. 흥미가 있는 분은 꼭 시험해 보세요.
덧붙여 빈의 수는 스타 제스의 공식으로 산출한 값을 참고로 하고 있습니다.
import math
def get_bin_count(size):
return round(1 + math.log2(size))
def create_bins(df, col, bin_count):
bin_width = df[col].max() // bin_count
df[col] = (df[col] // bin_width) * bin_width
return df
# 連続変数のビン分割
bin_count = get_bin_count(df.shape[0])
df = create_bins(df, 'cont_var1', bin_count)
df = create_bins(df, 'cont_var2', bin_count)
# ビンごとに残った連続変数の集計
heatmap_input = pd.pivot_table(df, index='cont_var1', columns='cont_var2', values='cont_var3', aggfunc=np.sum).fillna(0)
3. 히트맵 생성
마지막으로 imshow를 사용하여 2의 집계 결과를 플로팅합니다.
플롯 할 때는 아래에주의하면 혼란이 적다고 생각합니다.
이것을 설정하지 않으면 각 축의 레이블에 테이블의 인덱스 번호와 열 번호가 사용됩니다.
기본 원점은 그래프의 왼쪽 상단에 설정되므로이를 설정하지 않으면 y 축에 대해 반전 된 그래프가 그려집니다.
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
hmap = ax.imshow(hmap_input,
extent=[hmap_input.columns.min(),
hmap_input.columns.max(),
hmap_input.index.max(),
hmap_input.index.min()],
cmap='viridis')
ax.invert_yaxis()
ax.set_title('SUM')
ax.set_xlabel('cont_var1')
ax.set_ylabel('cont_var2')
fig.colorbar(hmap, ax=ax)
plt.show()
이렇게하면 시작 부분에 표시된 히트 맵이 그려집니다.
결론
이번은 간단하게 합을 3축째(색)에 플롯 했습니다만, 집계 방법을 변경하는 것으로 여러가지 시험할 수 있다고 생각합니다. 참고해 주시면 다행입니다.
이미지의 플롯에 자주 이용하는 imshow 메소드를 유용한 이 방법을 생각해 냈을 때는, 「오, 자신 하는 잖아」라고 생각해 버렸습니다만, 비교적 메이저인 방법이었다는 것을 나중에 조사해 알 네. 미리 조사하는 것이 중요합니다.
Reference
이 문제에 관하여(히트 맵의 세 번째 축 (색상)을 사용자 정의하는 방법 (N 번 달임)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/oakareaioh/items/ce9518b2ae0a342ca489텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)