2017-12-09 18 views
2

私はpythonで海底を使ってヒートマップを取得しようとしています。残念ながら、数値が非常に大きいにもかかわらず、科学記法を使用していません。私は、科学記法または他の合理的な形式に変換する簡単な方法があるかどうか疑問に思っていました。ここでの問題を示しているコードの一部だ:seabornヒートマップラベルで科学記法を使用するには?

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) 

得られたプロットは、次

heatmap with bad format

答えて

1

あるヒートマップは、入力からxticklabels/yticklabelsコマンドにそのラベルを作成することを可能にします。これらは軸に沿って配置されるため、外観を変更する数値形式はありません。

オプションは、ラベルをヒートマップに供給する前にフォーマットすることです。この目的のために、matplotlib ScalarFormatterを(誤って)使用すると、浮動小数点数から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

関連する問題