首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在matplotlib中使用Colormap设置线条的颜色

在matplotlib中使用Colormap设置线条的颜色
EN

Stack Overflow用户
提问于 2012-01-20 02:24:01
回答 4查看 202.8K关注 0票数 76

如何使用色彩映射表(比如jet)在matplotlib中使用在运行时提供的标量值来设置线条的颜色?我在这里尝试了几种不同的方法,我想我被难住了。values[]是一个存储的标量数组。曲线是一组一维的数组,标签是文本字符串的数组。每个数组具有相同的长度。

代码语言:javascript
复制
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()
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-01-20 02:34:10

您收到的错误是由于您定义jet的方式造成的。您正在创建名为‘Colormap’的基类jet,但这与获取'jet‘色彩映射的默认定义有很大不同。这个基类永远不应该被直接创建,只有子类应该被实例化。

你在你的例子中发现了Matplotlib中的一个错误行为。在运行此代码时,应该会生成更清晰的错误消息。

这是您的示例的更新版本:

代码语言:javascript
复制
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是对我的相关答案中提出的方法的改进:creating over 20 unique legend colors using matplotlib

票数 89
EN

Stack Overflow用户

发布于 2015-11-25 07:40:30

我认为将我认为更简单的方法与matplotlib的cm类型的对象结合起来使用numpy的linspace会更有好处。上面的解决方案可能是针对较旧版本的。我使用的是python 3.4.3、matplotlib 1.4.3和numpy 1.9.3,我的解决方案如下。

代码语言:javascript
复制
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色彩映射表,如下图所示。如果您运行此脚本,您会发现您可以放大各个行。

现在假设我希望我的1000行颜色只跨越400到600行之间的绿色部分。我只需将开始和停止值更改为0.4和0.6,这将导致仅使用0.4到0.6之间的20%的cm.jet颜色映射。

因此,在一行摘要中,您可以相应地从matplotlib.cm色彩映射表创建rgba颜色列表:

代码语言:javascript
复制
colors = [ cm.jet(x) for x in linspace(start, stop, number_of_lines) ]

在本例中,我使用了通常调用的名为jet的映射,但您可以通过调用以下命令找到matplotlib版本中可用的色彩映射的完整列表:

代码语言:javascript
复制
>>> from matplotlib import cm
>>> dir(cm)
票数 73
EN

Stack Overflow用户

发布于 2017-04-15 01:46:12

来自matplotlib的线条样式、标记和定性颜色的组合

代码语言:javascript
复制
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);

更新:不仅支持ListedColormap,还支持LinearSegmentedColormap

代码语言:javascript
复制
import itertools
import matplotlib.pyplot as plt
Ncolors = 8
#colormap = plt.cm.Dark2# ListedColormap
colormap = plt.cm.viridis# LinearSegmentedColormap
Ncolors = min(colormap.N,Ncolors)
mapcolors = [colormap(int(x*colormap.N/Ncolors)) for x in range(Ncolors)]
N = Ncolors*4+10
l_styles = ['-','--','-.',':']
m_styles = ['','.','o','^','*']
fig,ax = plt.subplots(gridspec_kw=dict(right=0.6))
for i,(marker,linestyle,color) in zip(range(N),itertools.product(m_styles,l_styles, mapcolors)):
    ax.plot([0,1,2],[0,2*i,2*i], color=color, linestyle=linestyle,marker=marker,label=i)
ax.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.,ncol=3,prop={'size': 8})

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8931268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档