¿Cómo cambiar un ‘LinearSegmentedColormap’ a una distribución diferente de color?

Estoy tratando de hacer un mapa de color que “favorezca” valores más bajos, es decir, se tarda más en salir del color más oscuro para obtener el color claro. En este momento estoy usando esto como el mapa de colores:

cmap = clr.LinearSegmentedColormap.from_list('custom blue', ['#ffff00','#002266'], N=256) 

Estoy trazando esto alrededor de un cilindro para ver el efecto (ver código para el cilindro al final del post), esto es lo que sucede cuando ejecutas el código:

introduzca la descripción de la imagen aquí

Como pueden ver, esto es muy ‘lineal’. El color comienza a cambiar aproximadamente a la mitad del cilindro. ¿Hay una manera de boost el umbral para cuando los colores comienzan a cambiar rápidamente? Es decir, quiero que solo los números muy altos tengan el nivel de amarillo más shiny. Gracias.

 from matplotlib import cm from matplotlib import pyplot as plt from mpl_toolkits.mplot3d import Axes3D from scipy.linalg import norm from mpl_toolkits.mplot3d.art3d import Poly3DCollection import numpy as np import math import mpl_toolkits.mplot3d.art3d as art3d import matplotlib.colors as clr fig = plt.figure() ax = fig.add_subplot(111, projection='3d') origin = [0,0,0] #radius = R p0 = np.array(origin) p1 = np.array([8, 8, 8]) origin = np.array(origin) R = 1 #vector in direction of axis v = p1 - p0 #find magnitude of vector mag = norm(v) #unit vector in direction of axis v = v / mag #make some vector not in the same direction as v not_v = np.array([1, 0, 0]) if (v == not_v).all(): not_v = np.array([0, 1, 0]) #make vector perpendicular to v n1 = np.cross(v, not_v) #normalize n1 n1 /= norm(n1) #make unit vector perpendicular to v and n1 n2 = np.cross(v, n1) #surface ranges over t from 0 to length of axis and 0 to 2*pi t = np.linspace(0, mag, 600) theta = np.linspace(0, 2 * np.pi, 100) #use meshgrid to make 2d arrays t, theta = np.meshgrid(t, theta) #generate coordinates for surface X, Y, Z = [p0[i] + v[i] * t + R * np.sin(theta) * n1[i] + R * np.cos(theta) * n2[i] for i in [0, 1, 2]] #THIS IS WHERE THE COLOR MAP IS cmap = clr.LinearSegmentedColormap.from_list('custom blue', ['#ffff00','#002266'], N=256) col1 = cmap(np.linspace(0,1,600)) # linear gradient along the t-axis col1 = np.repeat(col1[np.newaxis,:, :], 100, axis=0) # expand over the theta- axis ax.plot_surface(X, Y,Z, facecolors = col1, shade = True,edgecolors = "None", alpha = 0.9, linewidth = 0) ax.view_init(15,-40) plt.show() 

Al hacer LinearSegmentedColormap.from_list con LinearSegmentedColormap.from_list , puede proporcionar una lista de tuplas del formulario (valor, color) (en lugar de simplemente una lista de colores) donde los valores corresponden a las posiciones relativas de los colores. Los valores deben estar comprendidos entre 0 y 1 por lo que deberá suministrar un color intermedio. En tu caso yo podría intentar esto,

 cmap = clr.LinearSegmentedColormap.from_list('custom blue', [(0, '#ffff00'), (0.25, '#002266'), (1, '#002266')], N=256) 

y ajustar el color / valor hasta que esté satisfecho. El crédito va a https://stackoverflow.com/a/25000108/5285918

introduzca la descripción de la imagen aquí