使用Colormaps在matplotlib中设置线的颜色
在matplotlib中,如何使用colormap(比如jet
)在运行时提供标量值来设置颜色? 我在这里尝试了几种不同的方法,我觉得我很难过。 values[]
是一个标量数组。 曲线是一组一维数组,标签是一组文本string。 每个arrays具有相同的长度。
fig = plt.figure() ax = fig.add_subplot(111) jet = colors.Colormap('jet') cNorm = colors.Normalize(vmin=0, vmax=values[-1]) scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=jet) lines = [] for idx in range(len(curves)): line = curves[idx] colorVal = scalarMap.to_rgba(values[idx]) retLine, = ax.plot(line, color=colorVal) #retLine.set_color() lines.append(retLine) ax.legend(lines, labels, loc='upper right') ax.grid() plt.show()
你收到的错误是由于你如何定义jet
。 您正在使用名称“jet”创build基类Colormap
,但这与获取“jet”颜色表的默认定义完全不同。 永远不要直接创build这个基类,只应该实例化子类。
你在你的例子中发现的是Matplotlib中的一个错误行为。 运行此代码时应该生成更清晰的错误消息。
这是你的例子的更新版本:
import matplotlib.pyplot as plt import matplotlib.colors as colors import matplotlib.cm as cmx import numpy as np # define some random data that emulates your indeded code: NCURVES = 10 np.random.seed(101) curves = [np.random.random(20) for i in range(NCURVES)] values = range(NCURVES) fig = plt.figure() ax = fig.add_subplot(111) # replace the next line #jet = colors.Colormap('jet') # with jet = cm = plt.get_cmap('jet') cNorm = colors.Normalize(vmin=0, vmax=values[-1]) scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=jet) print scalarMap.get_clim() lines = [] for idx in range(len(curves)): line = curves[idx] colorVal = scalarMap.to_rgba(values[idx]) colorText = ( 'color: (%4.2f,%4.2f,%4.2f)'%(colorVal[0],colorVal[1],colorVal[2]) ) retLine, = ax.plot(line, color=colorVal, label=colorText) lines.append(retLine) #added this to get the legend to work handles,labels = ax.get_legend_handles_labels() ax.legend(handles, labels, loc='upper right') ax.grid() plt.show()
导致:
使用ScalarMappable
是对我的相关答案中提出的方法的改进: 使用matplotlib创build超过20个独特的图例颜色
我认为这将是有益的,包括我认为是一个更简单的方法使用numpy的linspace结合matplotlib的厘米types的对象。 上面的解决scheme可能是旧版本的。 我使用python 3.4.3,matplotlib 1.4.3和numpy 1.9.3,我的解决scheme如下。
import matplotlib.pyplot as plt from matplotlib import cm from numpy import linspace start = 0.0 stop = 1.0 number_of_lines= 1000 cm_subsection = linspace(start, stop, number_of_lines) colors = [ cm.jet(x) for x in cm_subsection ] for i, color in enumerate(colors): plt.axhline(i, color=color) plt.ylabel('Line Number') plt.show()
这会产生1000条跨越整个cm.jet颜色映射的独特颜色的线条,如下图所示。 如果你运行这个脚本,你会发现你可以放大个别行。
在0.0到1.0之间,1000个刻度
现在说我想让我的1000线颜色只跨越线条400到600之间的绿色部分。我只是简单地将我的开始和结束值改为0.4和0.6,结果只使用了0.4和0.2之间的cm.jet彩色图的20% 0.6。
0.4到0.6之间,1000刻度
因此,在一行摘要中,您可以相应地从matplotlib.cm颜色表创build一个rgba颜色列表:
colors = [ cm.jet(x) for x in linspace(start, stop, number_of_lines) ]
在这种情况下,我使用名为jet的通用映射,但可以通过调用以下代码findmatplotlib版本中可用的colormap的完整列表:
>>> from matplotlib import cm >>> dir(cm)
线样式,标记和matplotlib
定性颜色的组合:
import itertools import matplotlib as mpl import matplotlib.pyplot as plt N = 8*4+10 l_styles = ['-','--','-.',':'] m_styles = ['','.','o','^','*'] colormap = mpl.cm.Dark2.colors # Qualitative colormap for i,(marker,linestyle,color) in zip(range(N),itertools.product(m_styles,l_styles, colormap)): plt.plot([0,1,2],[0,2*i,2*i], color=color, linestyle=linestyle,marker=marker,label=i) plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.,ncol=4);