Nicht-lineare Skalierung der Farbzuordnung der Kontrast erhöht werden
Den folgenden python-code erstellt eine heatmap einer matrix mit normal verteilten Werte
import numpy as np
from matplotlib import pylab as plt
np.random.seed(123) #make sure we all have same data
m = np.random.randn(200).reshape(10, 20)
plt.imshow(m, cmap='RdYlGn', interpolation='nearest')
plt.colorbar()
Dies ist die Ausgabe dieses Codes
Ich würde wie um den Kontrast zu erhöhen dieses Bild von "fading out" der Werte nahe null.
Ich kann dies ganz einfach mit disigmoid Skalierung der original-Daten wie folgt:
def disigmoidScaling(values, steepnessFactor=1, ref=None):
''' Sigmoid scaling in which values around a reference point are flattened
arround a reference point
Scaled value y is calculated as
y = sign(v - d)(1 - exp(-((x - d)/s)**2)))
where v is the original value, d is the referenc point and s is the
steepness factor
'''
if ref is None:
mn = np.min(values)
mx = np.max(values)
ref = mn + (mx - mn) / 2.0
sgn = np.sign(values - ref)
term1 = ((values - ref)/steepnessFactor) ** 2
term2 = np.exp(- term1)
term3 = 1.0 - term2
return sgn * term3
plt.imshow(disigmoidScaling(m, 4), cmap='RdYlGn', interpolation='nearest')
plt.colorbar()
Hier ist die Ausgabe.
Ich bin zufrieden mit dem Ergebnis, außer der Tatsache, dass in dieser version das original
Werte ausgetauscht worden sind, für gewählt werden.
Gibt es eine Möglichkeit, führen Sie eine nicht-lineare Zuordnung der Werte zu colormap?
- Diese Frage kann von Interesse sein, auch hier: stackoverflow.com/questions/46038206/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer Farbpalette enthält ein Wörterbuch der rot -, grün-und blau-Werte abgebildet über dem Intervall [0,1]. Die Lineare Segmentierte Colormap Klasse docs zum Beispiel gebe
"Jede Zeile in der Tabelle für eine bestimmte Farbe ist eine Sequenz von x, y0, y1 Tupel. In jeder Sequenz, x erhöhen müssen, monoton von 0 auf 1. Für jeden input-Wert z, die zwischen x[i] und x[i+1], die Ausgabe-Wert einer bestimmten Farbe wird Linear interpoliert zwischen y1[i] und y0[i+1]:"
Den
RdYlGn
Farbpalette 11 x-Werte für jede Farbe von 0 bis 1,0 in Schritten von 0.1. Sie können diecdict
Werte durch aufrufenKönnen Sie dann ändern Sie die x-Werte zu, was auch immer Schritte, die Sie möchten (solange Sie streng monoton Steigend und im Bereich von 0 bis 1) und eine neue Farbpalette durch aufrufen
matplotlib.colors.LinearSegmentedColormap
auf Ihren neuencdict
. Es gibt einige gute Beispiele dafür in der Matplotlib Kochbuch.