2017-12-09 10 views
2

Ich versuche eine Heatmap mit Seaborn in Python zu bekommen. Leider verwendet es keine wissenschaftliche Notation, obwohl die Zahlen sehr groß sind. Ich habe mich gefragt, ob es eine einfache Möglichkeit gibt, in wissenschaftliche Notation oder ein anderes vernünftiges Format zu konvertieren. Hier ist ein Stück Code, der das Problem zeigt:Wie wird wissenschaftliche Notation in Seaborn-Heatmap-Labels verwendet?

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) 

Das resultierende Handlung ist die folgende

heatmap with bad format

Antwort

1

Die Heatmap seine Etiketten von dem Eingang zu dem xticklabels/yticklabels Befehl erstellen können. Diese werden dann entlang der Achsen platziert, so dass es kein numerisches Format gibt, um ihr Aussehen zu ändern.

Eine Option besteht darin, die Etiketten zu formatieren, bevor sie an die Heatmap geliefert werden. Zu diesem Zweck kann eine Matplotlib ScalarFormatter (falsch) verwendet werden, die es ermöglicht, automatisch eine MathText-Zeichenfolge aus einer Gleitkommazahl zu generieren. Im Folgenden wäre ein Beispiel:

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

schön, das ist genau das, was ich wollte! – German

2

Wenn Sie w/o sns.heatmap zu tun tragen kann, seine vielleicht natürlichere dies mit 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

zu tun

Wie unten ausgeführt, zentriert sich pcolormesh nicht auf die gleiche Weise. Außerdem fällt tatsächlich ein Level. Ich habe eine PR, um dieses Verhalten zu ändern, hier ist eine Problemumgehung. Ich gebe zu diesem Zeitpunkt, es ist nicht viel eleganter als mit dem heatmap Ausgang.

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

Das ist großartig, außer dass es nicht klar ist, welches Rechteck jedem Etikett entspricht. ist es der eine nach rechts oder nach links? – German

Verwandte Themen