我有一个0到102之间的数据矩阵,当使用imshow时,我希望0显示为烧红色,1显示为黄绿色,其他每个值显示为2到102为线性从标准绿色到深绿色的渐变。
到目前为止,我已尝试使用色彩图' Greens'并取代前两个值,但我的结果不一致,我不知道如何只使用一半的色彩图。 我还尝试使用colordict生成我自己的colormap,然后覆盖前两个条目,但根据提交的数据,它也有不一致的结果(例如1显示为烧红色)
答案 0 :(得分:2)
您可以使用make_colormap
制作自定义色彩映射:
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.6.2/css/font-awesome.min.css" rel="stylesheet"/>
<div ng-app="app" ng-controller="mainCtrl">
<form name="form" novalidate>
<select ng-model="permissionForm.homePostPermission" ng-options="permission.name for permission in permissions" required>
</select>
</form>
</div>
mygreen = make_colormap([c('burnt red'),
c('yellow green'), idx[1], c('yellow green'),
(0,1,0), idx[2], (0,1,0), # RGB (0,1,0) is standard green?
c('dark green')])
的参数是一系列RGB值和浮点数。
每个浮点数都夹在两个RGB值之间。
浮点数表示颜色映射的位置(在0.0到1.0的范围内) 从一种RGB颜色过渡到下一种颜色。
序列中的第一个和最后一个值是第一个和最后一个颜色 彩色地图。
make_colormap
另一个(可能更好)选项是修改import numpy as np
import matplotlib.colors as mcolors
import matplotlib.pyplot as plt
np.random.seed(2016)
def make_colormap(seq):
"""Return a LinearSegmentedColormap
seq: a sequence of floats and RGB-tuples.
- Every float is sandwiched between two RGB values.
- The floats indicate locations (on a scale from 0.0 to 1.0) where the
color map transitions from one RGB color to the next.
- The floats should be in increasing order
- The first and last values in the sequence are the first and last
colors in the color map.
https://stackoverflow.com/q/16834861/190597 (unutbu)
"""
seq = [(None,) * 3, 0.0] + list(seq) + [1.0, (None,) * 3]
cdict = {'red': [], 'green': [], 'blue': []}
for i, item in enumerate(seq):
if isinstance(item, float):
r1, g1, b1 = seq[i - 1]
r2, g2, b2 = seq[i + 1]
cdict['red'].append([item, r1, r2])
cdict['green'].append([item, g1, g2])
cdict['blue'].append([item, b1, b2])
return mcolors.LinearSegmentedColormap('CustomMap', cdict)
# There are 103 integers from 0 to 102 (inclusive)
idx = np.linspace(0, 1, 103)
c = mcolors.ColorConverter().to_rgb
mygreen = make_colormap([c('burnt red'),
c('yellow green'), idx[1], c('yellow green'),
(0,1,0), idx[2], (0,1,0), # RGB (0,1,0) is standard green?
c('dark green')])
arr = np.random.randint(0, 103, size=(11, 11))
print(np.where(arr==0))
print(np.where(arr==1))
plt.imshow(arr, interpolation='nearest', cmap=mygreen, vmin=0, vmax=102)
plt.colorbar(ticks=list(range(0, 100, 10))+[102])
plt.show()
以利用matplotlib
arr
和cmap.set_under
方法。这些色彩映射方法允许您为其设置颜色
所有低于或超过指定限制的值:
cmap.set_over
因此,在你只有两种特殊颜色的特殊情况下,你可以
修改cmap = make_colormap([(0,1,0), c('dark green')])
cmap.set_under('burnt red')
cmap.set_over('yellow green')
以便将0映射到负数,并将1映射到a
数字大于100,并将其余数字移至0到0的范围内
100:
arr
例如,
arr -= 2
arr = np.where(arr==-1, 102, arr)