在matplotlib中离散然后线性色图

时间:2016-05-21 09:54:55

标签: python matplotlib

我有一个0到102之间的数据矩阵,当使用imshow时,我希望0显示为烧红色,1显示为黄绿色,其他每个值显示为2到102为线性从标准绿色到深绿色的渐变。

到目前为止,我已尝试使用色彩图' Greens'并取代前两个值,但我的结果不一致,我不知道如何只使用一半的色彩图。 我还尝试使用colordict生成我自己的colormap,然后覆盖前两个条目,但根据提交的数据,它也有不一致的结果(例如1显示为烧红色)

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

enter image description here

另一个(可能更好)选项是修改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 arrcmap.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)

enter image description here