Python 创建渐变颜色贴图-matplotlib
我正在尝试创建一个Python 创建渐变颜色贴图-matplotlib,python,matplotlib,colors,colormap,Python,Matplotlib,Colors,Colormap,我正在尝试创建一个彩色贴图,它是从深红色到非常浅绿色/白色的渐变。我将在下面附上一个输出示例作为屏幕截图 我已经玩过以下code: from matplotlib import pyplot as plt import matplotlib import numpy as np plt.figure() a=np.outer(np.arange(0,1,0.01),np.ones(100)) cdict2 = {'red': [(0.0, 0.1, 0.2),
彩色贴图
,它是从深红色
到非常浅绿色/白色
的渐变。我将在下面附上一个输出示例作为屏幕截图
我已经玩过以下code
:
from matplotlib import pyplot as plt
import matplotlib
import numpy as np
plt.figure()
a=np.outer(np.arange(0,1,0.01),np.ones(100))
cdict2 = {'red': [(0.0, 0.1, 0.2),
(0.3, 0.4, 0.5),
(0.5, 0.5, 0.5),
(1.0, 1.0, 1.0)],
'green': [(0.0, 0.0, 0.0),
(0.5, 0.5, 0.5),
(0.75, 1.0, 1.0),
(1.0, 1.0, 1.0)],
'blue': [(0.0, 0.0, 0.0),
(0.0, 0.0, 0.0),
(1.0, 1.0, 1.0)]}
my_cmap2 = matplotlib.colors.LinearSegmentedColormap('my_colormap2',cdict2,256)
plt.imshow(a,aspect='auto', cmap =my_cmap2)
plt.show()
但是我无法让它复制附加的颜色映射。我也不确定是否有更有效的方法来实现这一点
当前输出:我已经操纵了这些值,尝试获得渐变
,以复制附加的颜色贴图
。但是我不能得到正确的红橙黄绿梯度
来自其他答案:
from matplotlib import pyplot as plt
import matplotlib
import numpy as np
import matplotlib.colors as colors
def truncate_colormap(cmap, minval=0.0, maxval=1.0, n=100):
new_cmap = colors.LinearSegmentedColormap.from_list(
'trunc({n},{a:.2f},{b:.2f})'.format(n=cmap.name, a=minval, b=maxval),
cmap(np.linspace(minval, maxval, n)))
return new_cmap
arr = np.linspace(0, 50, 100).reshape((10, 10))
fig, ax = plt.subplots(ncols = 2)
new_cmap1 = truncate_colormap(plt.get_cmap('jet'), 0.45, 1.0)
new_cmap2 = truncate_colormap(plt.get_cmap('brg'), 1.0, 0.45)
ax[0].imshow(a,aspect='auto', cmap = new_cmap1)
ax[1].imshow(a,aspect='auto', cmap = new_cmap2)
plt.show()
您可以加载已有的图像并从中创建颜色贴图。不幸的是,图像有白色的边框——这些边框需要先剪掉
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import numpy as np
cim = plt.imread("https://i.stack.imgur.com/4q2Ev.png")
cim = cim[cim.shape[0]//2, 8:740, :]
cmap = mcolors.ListedColormap(cim)
data = np.random.rand(10,10)
plt.imshow(data, cmap=cmap)
plt.colorbar()
plt.show()
由于您试图模拟现有渐变,而不是从任意颜色创建渐变,因此只需找到与测量的渐变值匹配的公式即可
从梯度上每个点的平均像素r、g、b值开始。你需要先得到一张纯图像,你发布的图像有一个白色的边框和一些边缘上的铃声;我用了一个图像编辑器来清理它
获得测量值后,可以使用进行曲线拟合。我胡乱猜测5度就足够了,可以得到6个系数的数组。在这里,您可以看到覆盖拟合曲线的测量值图。我认为这是一场很好的比赛
下面是使用这些曲线重新创建渐变的代码
rp = [-1029.86559098, 2344.5778132 , -1033.38786418, -487.3693808 ,
298.50245209, 167.25393272]
gp = [ 551.32444915, -1098.30287507, 320.71732031, 258.50778539,
193.11772901, 30.32958789]
bp = [ 222.95535971, -1693.48546233, 2455.80348727, -726.44075478,
-69.61151887, 67.591787 ]
def clamp(n):
return min(255, max(0, n))
def gradient(x, rfactors, gfactors, bfactors):
'''
Return the r,g,b values along the predefined gradient for
x in the range [0.0, 1.0].
'''
n = len(rfactors)
r = clamp(int(sum(rfactors[i] * (x**(n-1-i)) for i in range(n))))
g = clamp(int(sum(gfactors[i] * (x**(n-1-i)) for i in range(n))))
b = clamp(int(sum(bfactors[i] * (x**(n-1-i)) for i in range(n))))
return r, g, b
from PIL import Image
im = Image.new('RGB', (742, 30))
ld = im.load()
for x in range(742):
fx = x / (742 - 1)
for y in range(30):
ld[x,y] = gradient(fx, rp, gp, bp)
那么,您当前的代码产生了什么?您只是在选择正确的颜色时遇到了问题吗?您可以使用颜色选择器工具(通常是滴管)获取要复制的颜色栏的RGB值。对不起。我对它变化无常,但这是一个非常浅绿色,甚至白色的过渡。我可能需要另一种方法对不起