Python matplotlib 手动色彩映射
我在用Python的matplotlib库中的basemap来绘制二维数据。我的数据值从0到超过1000不等。我想知道能不能手动设置一个颜色映射表,让颜色和数值之间有固定的对应关系。这个颜色映射表应该像这样:
对于不同的数值,设置对应的颜色:
- 0 - 1 - 白色
- 1 - 5 - 深绿色
- 5 - 10 - 浅绿色
- 10 - 25 - 黄色
- 25 - 50 - 棕色
- 50 - 100 - 橙色
- 100 - 500 - 浅红色
- 500 - 1000 - 深红色
- > 1000 - 紫色
我刚开始学Python,所以任何建议都很欢迎。
2 个回答
0
像这样应该可以工作:
from matplotlib import pyplot
from matplotlib.colors import LinearSegmentedColormap
def create_cmap(data, colours, stops=None):
min_x = min(data)
max_x = max(data)
if stops is not None:
min_x = min(min_x, min(stops))
max_x = max(max_x, max(stops))
if stops is None:
d_x = (max_x - min_x)/(len(colours)-1)
stops = [min_x + i*d_x for i in range(len(colours))]
if min_x < min(stops):
stops = [min_x] + stops
colours = [colours[0]] + colours
if max_x > max(stops):
stops = stops + [max_x]
colours = colours + [colours[-1]]
stops = [(s-min_x)/(max_x-min_x) for s in stops]
cmap_data = list(zip(stops, colours))
cmap = LinearSegmentedColormap.from_list('continuous_map', cmap_data)
def cmap_wrapper(x):
x = max(min_x, min(x, max_x))
x_n = (x-min_x)/(max_x-min_x)
return cmap(x_n)
return cmap_wrapper
colours = ['xkcd:white', 'xkcd:darkgreen', 'xkcd:lightgreen', 'xkcd:yellow', 'xkcd:brown', 'xkcd:orange', 'xkcd:coral', 'xkcd:crimson', 'xkcd:purple']
stops = [0, 1, 5, 10, 25, 50, 100, 500, 1000]
cmap = create_cmap(stops, colours, stops=stops)
fig = pyplot.figure(figsize=(10,10))
ax = fig.add_subplot(1,1,1)
for y in range(1000):
ax.plot([0,1],[y,y],c=cmap(y))
pyplot.show()
7
这个正是你想要的。
不过,输入的方式有点让人困惑,所以这个可能会更有帮助。
要处理大于1000的部分,你需要把超过1000的值遮罩掉,然后让其余的范围从0到1000。
from matplotlib.colors import LinearSegmentedColormap
cMap = []
for value, colour in zip([0,1,5,10,25,50,100,500,1000],["White", "DarkGreen", "LightGreen", "Yellow", "Brown", "Orange", "IndianRed", "DarkRed", "Purple"]):
cMap.append((value/1000.0, colour))
customColourMap = LinearSegmentedColormap.from_list("custom", cMap)
这就是你创建自定义颜色图所需的全部内容。使用时,只需将其作为命名参数cmap
传入绘图函数(无论你用的是哪个函数)即可。
这就是它的样子。