我正在尝试将一个数据集表示为我的绘图中的颜色块(而不是显示为可变宽度条形图,我想将其显示为具有背景颜色的可变宽度块。)
我可以这样做:
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的最小值和最大值。
谢谢!
答案 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()
答案 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之间)传递给颜色映射。