Python 如何获取彩色贴图的一部分

Python 如何获取彩色贴图的一部分,python,python-3.x,pandas,matplotlib,colormap,Python,Python 3.x,Pandas,Matplotlib,Colormap,我正在从类中的数据框“self.data”绘制一些曲线。dataframe的每一列都是一条曲线,列名写在该行的末尾 我制作这个程序就是为了这样: cmap = plt.cm.get_cmap('brg', len(self.data.columns)+1) for i in range(len(self.data.columns)): #plot curves and add legend self.courbe.plot(self.data[self.data.columns

我正在从类中的数据框“self.data”绘制一些曲线。dataframe的每一列都是一条曲线,列名写在该行的末尾

我制作这个程序就是为了这样:

cmap = plt.cm.get_cmap('brg', len(self.data.columns)+1)

for i in range(len(self.data.columns)): #plot curves and add legend
        self.courbe.plot(self.data[self.data.columns[i]],c=cmap(i))

        angle=20
        self.courbe.annotate(self.data.columns[i], 
                    xy= (max(self.data.index),self.data.at[max(self.data.index),self.data.columns[i]]),
                    textcoords='offset points',
                    xytext=(2, 0),
                    va='bottom',
                    rotation=angle,c=cmap(i))
所以我使用了“brg”颜色贴图,但我只想使用这个颜色贴图的一部分(例如删除浅绿色部分)

我在stackoverflow上尝试了一些建议的解决方案,但所有曲线的颜色都相同。有人知道另一种方法吗

谢谢,祝您愉快:)

a用于将数字范围映射到colormap所需的0..1范围。我们可以创建一个特殊的规范来达到预期的效果

范数取决于vmin(最低索引)和vmax(最高索引)
vmin
将映射到0,vmax映射到1

选择上部和下部颜色(每个颜色介于0和1之间),例如,上部=0.9以在中的浅绿色处停止。和lower=0,以获得所有深蓝颜色

公式查找将索引
i=0
映射到较低颜色的vmin和vmax,并将索引
i=num\u colors-1
映射到较高颜色的vmin和vmax。该公式源自唯一的线性方程,该方程映射:

  • 0
    to
    lower\u color
  • num\u colors-1
    upper\u colors
  • vmin
    0
  • vmax
    1
您可以找到值
i=0..num_colors-1的颜色索引为
norm(i)
,相应的颜色为
cmap(norm(i))

导入matplotlib.pyplot作为plt
将matplotlib导入为mpl
cmap=plt.cm.get_cmap('brg'))
#介于0和1之间,0表示范围中最左侧的颜色,1表示最右侧的颜色,上部>下部
上色=0.8
较低的颜色=0.3
num_colors=20#len(self.data.columns)
因子=(数值颜色-1)/(上颜色-下颜色)
norm=mpl.colors.Normalize(vmin=-lower_color*因子,vmax=(1-lower_color)*因子)
对于范围内的i(num_颜色):
plt.图([0,1],[0,i],c=cmap(范数(i)))
plt.show()
一个使用
brg
贴图并在0.3和0.8之间选择颜色的示例,只是为了演示其工作原理。作为参考,有一个色条应用了相同的限制。以及用于
brg
的完整色条

颜色条的生成如下所示:

c\u map\u ax=plt.gcf()。添加轴([0.84,0.1,0.02,0.8])
mpl.colorbar.colorbase(c_map_ax,cmap=cmap,orientation='vertical')
c_贴图_ax.axes.set_ylim(下部颜色、上部颜色)
c_map_ax2=plt.gcf()。添加轴([0.92,0.1,0.02,0.8])
mpl.colorbar.colorbase(c_map_ax2,cmap=cmap,orientation='vertical')
plt.子批次调整(右=0.8)

另一个答案使用的因素可能有点不直观;因此,这里是相同的,只是没有任何规范或因素。您仍然可以选择介于0和1之间的上下限值,并从colormap获取该范围内的颜色。然后在它们上面循环:

import matplotlib.pyplot as plt
import numpy as np

cmap = plt.cm.get_cmap('brg')

# between 0 and 1, 0 for the leftmost color of the range, 1 for the rightmost, upper > lower
upper_color = 0.8
lower_color = 0.3
num_colors =  20 # len(self.data.columns)
colors = cmap(np.linspace(lower_color, upper_color, num_colors))

for i, color in enumerate(colors):
    plt.plot([0, 1], [0, i], color=color)

plt.show()

它工作得非常好!非常感谢您的解答和解释!我不明白这里使用的因素。我认为,如果
lower\u color=0.3
的话,人们会期望底线是紫色,而不是顶部。很好。对于此解决方案,您不需要上限>下限的限制。您甚至可以使用它来简单地反转颜色数组。