El siguiente código de pitón crea un mapa de calor de una matriz que contiene los valores distribuidos normalmentede escala no lineal de un mapa de colores para mejorar el contraste
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()
Ésta es la salida de este código
Me gustaría mejorar el contraste de esta imagen al "atenuar" los valores cercanos a cero. me puede hacer esto mediante el uso de la escala disigmoid de los datos originales de la siguiente manera:
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()
Aquí está la salida.
Estoy satisfecho con el resultado, salvo el hecho de que en esta versión los valores originales han sido intercambiados por los escalados.
¿Hay alguna manera de realizar un mapeo no lineal de valores en el mapa de colores?
Esta pregunta también puede ser de interés aquí: https://stackoverflow.com/questions/46038206/arbirtrary-non-linear-colorbar-using-matplotlib – ImportanceOfBeingErnest