如何在 Python 中创建颜色渐变? [英] How to create colour gradient in Python?

查看:108
本文介绍了如何在 Python 中创建颜色渐变?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想创建一个新的颜色图,它在绿色和蓝色(或任何其他两种颜色)之间进行插值.我的目标是得到类似的东西:

I want to create a new colormap which interpolates between green and blue (or any other two colours for that matter). My goal is to get something like:

首先,我真的不确定这是否可以使用蓝色和绿色的线性插值来完成.如果可以,我不知道该怎么做,我找到了一些关于使用 matplotlib 方法插入指定 RGB 值的文档 这里

First of all I am really not sure if this can be done using linear interpolation of blue and green. If it can, I'm not sure how to do so, I found some documentation on using a matplotlib method that interpolates specified RGB values here

真正的麻烦在于理解下面的cdict2"是如何工作的.例如,文档说:

The real trouble is understanding how "cdict2" works below. For the example the documentation says:

"示例:假设您希望红色在下半部分从 0 增加到 1,绿色在中间部分执行相同的操作,蓝色在上半部分执行相同的操作.那么您可以使用:"

"Example: suppose you want red to increase from 0 to 1 over the bottom half, green to do the same over the middle half, and blue over the top half. Then you would use:"

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(10))
cdict2 = {'red':   [(0.0,  0.0, 0.0),
                   (0.5,  1.0, 1.0),
                   (1.0,  1.0, 1.0)],
         'green': [(0.0,  0.0, 0.0),
                   (0.25, 0.0, 0.0),
                   (0.75, 1.0, 1.0),
                   (1.0,  1.0, 1.0)],
         'blue':  [(0.0,  0.0, 0.0),
                   (0.5,  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()

我现在了解插值是如何工作的,例如这将给出红色到白色的插值:

I now understand how the interpolation works, for example this will give a red to white interpolation:

白色到红色:沿着每种颜色的矩阵"列向下,在第一列中,我们有我们希望插值开始和结束的位置的 x 坐标,另外两列是颜色值的实际值在那个坐标.

White to red: Going down the columns of the "matrix" for each colour, in column one we have the xcoordinate of where we want the interpolation to start and end and the two other columns are the actual values for the colour value at that coordinate.

cdict2 = {'red':   [(0.0,  1.0, 1.0),
                    (1.0,  1.0, 1.0),
                    (1.0,  1.0, 1.0)],
         'green': [(0.0,  1.0, 1.0),
                   (1.0, 0.0, 0.0),
                   (1.0,  0.0, 0.0)],
     'blue':  [(0.0,  1.0, 1.0),
               (1.0,  0.0, 0.0),
               (1.0,  0.0, 0.0)]} 

很明显,通过在 RGB 空间中插值来创建我想要的渐变将非常困难......

It is evident that the gradient I want will be very difficult to create by interpolating in RGB space...

推荐答案

我还没有看到的一个简单答案是使用 色包.

A simple answer I have not seen yet is to just use the colour package.

通过pip安装

pip install colour

这样使用:

from colour import Color
red = Color("red")
colors = list(red.range_to(Color("green"),10))
    
# colors is now a list of length 10
# Containing: 
# [<Color red>, <Color #f13600>, <Color #e36500>, <Color #d58e00>, <Color #c7b000>, <Color #a4b800>, <Color #72aa00>, <Color #459c00>, <Color #208e00>, <Color green>]

将输入更改为您想要的任何颜色.正如@zelusp 所指出的,这将限制在只有两种颜色的平滑组合(例如,红色到蓝色中间会有黄色+绿色),但根据投票结果,很明显是一个数字的人发现这是一个有用的近似值

Change the inputs to any colors you want. As noted by @zelusp, this will not restrict itself to a smooth combination of only two colors (e.g. red to blue will have yellow+green in the middle), but based on the upvotes it's clear a number of folks find this to be a useful approximation

这篇关于如何在 Python 中创建颜色渐变?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆