Matplotlib:使用colormap显示制度(axvspan或bar?)

时间:2014-01-07 14:31:28

标签: python matplotlib

我正在尝试将一个数据集表示为我的绘图中的颜色块(而不是显示为可变宽度条形图,我想将其显示为具有背景颜色的可变宽度块。)

我可以这样做:

import numpy
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import matplotlib.colors as colors        

# Create fake data
x = numpy.linspace(0,4)
y = numpy.exp(x)

# Now plot one by one
bar_width = x[1] - x[0]  # assuming x is linealy spaced
for pointx, pointy in zip(x,y):
    point = 40
    current_color = cm.jet( min(pointy/30, 30)) # maximum of 30
    plt.bar(pointx, point, bar_width, color = current_color)       

plt.show()

但是我没有将colormap缩放到我的数据范围。

或者我可以这样做:

for i in range(10):
    color = cm.jet(min(i/30, 30))
    plt.axvspan(i, i+1, facecolor=color, alpha=0.5)

但这又是不能令人满意的,因为我希望有一种方法可以将我的数据自动调整到cmap的最小值和最大值。

谢谢!

2 个答案:

答案 0 :(得分:2)

有点不清楚你在寻找什么,但我认为你的一些问题可以通过使用来自cm.get_cmap的缩放cmap来回答。我们可以从0开始缩放数据范围并将其插入到cmap中。我通过简单地绘制多个条形图使条形图具有不同的宽度,可能有更好的matplotlib库调用来一次性执行此操作。

import numpy
import matplotlib.pyplot as plt
import matplotlib.cm as cm

# Create fake data
X = numpy.linspace(0,4)
Y = numpy.exp(X)

# Pick a cmap
cmap = cm.get_cmap('jet')

for x0,x1 in zip(Y,Y[1:]):
    c = cmap((x0-Y.min())/Y.max())
    plt.bar([x0,],1.0,x1-x0,
            color=c,
            linewidth=0)
plt.xlim(Y.min(),Y.max())
plt.show()

enter image description here

答案 1 :(得分:2)

根据“您的数据范围”,我认为您的意思是pointy>30的色彩图最大化。这可以通过简化current_color

轻松解决
import numpy
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import matplotlib.colors as colors        

# Create fake data
x = numpy.linspace(0,4)
y = numpy.exp(x)

# Now plot one by one
bar_width = x[1] - x[0]  # assuming x is linealy spaced
max_y = y.max()
min_y = y.min()

for pointx, pointy in zip(x,y):
    point = 40
    current_color = cm.jet((pointy - min_y)/(max_y - min_y))
    plt.bar(pointx, point, bar_width, color = current_color)       

plt.show()

之前,一旦pointy大于30,cmap.jet的值大于1,这是彩色地图的上限。相反,我们找到y的范围,然后找到通过pointy范围的路径的分数,并将该数字(在0和1之间)传递给颜色映射。

enter image description here