2017-12-09 8 views
2

파이썬에서 해븐을 사용하여 히트 맵을 얻으려고합니다. 불행히도 숫자가 매우 크더라도 과학 표기법을 사용하지 않습니다. 과학 표기법이나 다른 적절한 형식으로 변환 할 수있는 간단한 방법이 있는지 궁금합니다. 여기에 문제를 보여줍니다 코드의 일부는 다음과 같습니다seaborn heatmap 레이블에 과학 표기법을 사용하는 방법은 무엇입니까?

import seaborn as sns 
import numpy as np 
C_vals = np.logspace(3, 10, 8) 
g_vals = np.logspace(-6, 2, 9) 
score = np.random.rand(len(g_vals), len(C_vals)) 
sns.heatmap(score, xticklabels=C_vals, yticklabels=g_vals) 

결과 플롯은 히트 맵은 xticklabels/yticklabels 명령의 입력에서의 라벨을 만들 수 있습니다 다음

heatmap with bad format

답변

1

입니다. 그런 다음 축을 따라 배치되므로 모양을 변경하는 숫자 형식은 없습니다.

히트 맵에 레이블을 제공하기 전에 레이블을 포맷하는 옵션이 있습니다. 이를 위해 matplotlib ScalarFormatter을 실수로 사용할 수 있습니다. 자동으로 float 번호에서 MathText 문자열을 생성 할 수 있습니다. 예를 들면 다음과 같습니다

import matplotlib.pyplot as plt 
import matplotlib.ticker as ticker 
import seaborn as sns 
import numpy as np 

C_vals = np.logspace(3, 10, 8) 
g_vals = np.logspace(-6, 2, 9) 
score = np.random.rand(len(g_vals),len(C_vals)) 

tick = ticker.ScalarFormatter(useOffset=False, useMathText=True) 
tick.set_powerlimits((0,0)) 

tc = [u"${}$".format(tick.format_data(x)) for x in C_vals] 
tg = [u"${}$".format(tick.format_data(x)) for x in g_vals] 

sns.heatmap(score, xticklabels=tc, yticklabels=tg) 

plt.show() 

enter image description here

+0

아름다운, 그게 내가 원하는 것을 정확히! – German

2

당신이 w/O를 sns.heatmap을 수행 견딜 수있는 경우는이 작업을 수행하는 것이 아마도 더 자연 pcolormesh

import matplotlib.pyplot as plt 
import matplotlib.ticker as ticker 
import numpy as np 

C_vals = np.logspace(3, 10, 8) 
g_vals = np.logspace(-6, 2, 9) 
score = np.random.rand(len(g_vals),len(C_vals)) 

fig, ax = plt.subplots() 

ax.pcolormesh(C_vals, g_vals, score) 
ax.set_yscale('log') 
ax.set_xscale('log') 
plt.show() 

enter image description here

아래와 같이 pcolormesh은 같은 방법으로 가운데에 있지 않습니다. 또한, 실제로 레벨을 떨어 뜨립니다. 해당 동작을 변경하려면 PR이 있어야하지만 해결 방법이 있습니다. 나는이 시점에서 인정한다. 그 출력은 heatmap 출력보다 엉망이다.

import matplotlib.pyplot as plt 
import matplotlib.ticker as ticker 
import numpy as np 

C_vals = np.logspace(3, 10, 8) 
g_vals = np.logspace(-6, 2, 9) 
# make bracketing: 
def midpointext(x): 
    return np.hstack((1.5 * x[0] - 0.5 * x[1], 
      x[:-1] + 0.5 * np.diff(x), 
      1.5 * x[-1] - 0.5 * x[-2])) 
newC = np.log10(C_vals) 
newC = midpointext(newC) 
newC = 10**newC 
newg = np.log10(g_vals) 
newg = midpointext(newg) 
newg = 10**newg 
score = np.random.rand(len(g_vals),len(C_vals)) 
fig, ax = plt.subplots() 

ax.pcolormesh(newC, newg, score) 
ax.set_yscale('log') 
ax.set_xscale('log') 
plt.show() 

enter image description here

+0

각 라벨에 해당하는 사각형이 명확하지 않다는 점을 제외하면이 방법이 유용합니다. 그것이 오른쪽인가 왼쪽인가? – German

관련 문제