如何为 colorbar contourf matplotlib 设置刻度、颜色和标签的限制
How do I set limits on ticks, colors, and labels for colorbar contourf matplotlib
我有一个值的空间字段,我在一天中定期输出这些值。我正在用 contourf
绘图,我想在一天的数据过程中执行以下操作:
- 将颜色栏上的颜色限制为代表当天数据的最小值和最大值的值
- 在一天数据的最大值和最小值处,在 24 小时图上保持颜色条静态
- 在这 24 小时内保持标签不变
例如:
data = np.random.uniform(0, 5, size=(24,30,30))
data[3,:,:]=np.random.uniform(1,3,size=(30,30)) # example of bad plot
fgsize=(12,4)
numrecs = np.size(data,axis=0)
cbar_min = np.min(data)
cbar_max = np.max(data)
cbarlabels = np.linspace(np.floor(cbar_min), np.ceil(cbar_max), num=5, endpoint=True)
for tt in range(0, numrecs):
plt.figure(figsize=fgsize, dpi=80)
plt.title('this is a title')
plt.contourf(data[tt, :, :], 35, vmin=cbar_min, vmax=cbar_max, cmap='coolwarm')
cbar =plt.colorbar()
cbar.set_ticks(cbarlabels)
cbar.set_ticklabels(cbarlabels)
cbar.set_label('my data has units')
plt.show()
plt.close()
这是 bad plot 的示例。颜色似乎有限,但颜色条改变了它的 color/label 限制。我该如何解决?
这是一个 good plot 的例子。
事实证明,contourf 在设置颜色图的级别时有点棘手,请参阅 this answer。您可以通过对轮廓进行归一化来获得适当的限制和颜色,如下所示:
import numpy as np
import matplotlib.pyplot as plt
data = np.random.uniform(0, 5, size=(24,30,30))
data[3,:,:]=np.random.uniform(1,3,size=(30,30)) # example of bad plot
fgsize=(12,4)
numrecs = np.size(data,axis=0)
cbar_min = np.min(data)
cbar_max = np.max(data)
cbarlabels = np.linspace(np.floor(cbar_min), np.ceil(cbar_max), num=5, endpoint=True)
# Set the normalisation for 35 levels (as in your example)
import matplotlib.colors as mc
levels = np.linspace(np.floor(cbar_min), np.ceil(cbar_max), 35) # to draw 35 levels
norm = mc.BoundaryNorm(levels, 256)
for tt in range(0, numrecs):
print cbar_min, cbar_max
plt.figure(figsize=fgsize, dpi=80)
plt.title('this is a title')
# Draw those levels, with proper normalisation, here:
plt.contourf(data[tt, :, :], levels, vmin=cbar_min, vmax=cbar_max, cmap='coolwarm', levels=levels, norm=norm)
cbar = plt.colorbar()
cbar.set_ticks(cbarlabels)
cbar.set_ticklabels(cbarlabels)
cbar.set_label('my data has units')
plt.show()
我有一个值的空间字段,我在一天中定期输出这些值。我正在用 contourf
绘图,我想在一天的数据过程中执行以下操作:
- 将颜色栏上的颜色限制为代表当天数据的最小值和最大值的值
- 在一天数据的最大值和最小值处,在 24 小时图上保持颜色条静态
- 在这 24 小时内保持标签不变
例如:
data = np.random.uniform(0, 5, size=(24,30,30))
data[3,:,:]=np.random.uniform(1,3,size=(30,30)) # example of bad plot
fgsize=(12,4)
numrecs = np.size(data,axis=0)
cbar_min = np.min(data)
cbar_max = np.max(data)
cbarlabels = np.linspace(np.floor(cbar_min), np.ceil(cbar_max), num=5, endpoint=True)
for tt in range(0, numrecs):
plt.figure(figsize=fgsize, dpi=80)
plt.title('this is a title')
plt.contourf(data[tt, :, :], 35, vmin=cbar_min, vmax=cbar_max, cmap='coolwarm')
cbar =plt.colorbar()
cbar.set_ticks(cbarlabels)
cbar.set_ticklabels(cbarlabels)
cbar.set_label('my data has units')
plt.show()
plt.close()
这是 bad plot 的示例。颜色似乎有限,但颜色条改变了它的 color/label 限制。我该如何解决?
这是一个 good plot 的例子。
事实证明,contourf 在设置颜色图的级别时有点棘手,请参阅 this answer。您可以通过对轮廓进行归一化来获得适当的限制和颜色,如下所示:
import numpy as np
import matplotlib.pyplot as plt
data = np.random.uniform(0, 5, size=(24,30,30))
data[3,:,:]=np.random.uniform(1,3,size=(30,30)) # example of bad plot
fgsize=(12,4)
numrecs = np.size(data,axis=0)
cbar_min = np.min(data)
cbar_max = np.max(data)
cbarlabels = np.linspace(np.floor(cbar_min), np.ceil(cbar_max), num=5, endpoint=True)
# Set the normalisation for 35 levels (as in your example)
import matplotlib.colors as mc
levels = np.linspace(np.floor(cbar_min), np.ceil(cbar_max), 35) # to draw 35 levels
norm = mc.BoundaryNorm(levels, 256)
for tt in range(0, numrecs):
print cbar_min, cbar_max
plt.figure(figsize=fgsize, dpi=80)
plt.title('this is a title')
# Draw those levels, with proper normalisation, here:
plt.contourf(data[tt, :, :], levels, vmin=cbar_min, vmax=cbar_max, cmap='coolwarm', levels=levels, norm=norm)
cbar = plt.colorbar()
cbar.set_ticks(cbarlabels)
cbar.set_ticklabels(cbarlabels)
cbar.set_label('my data has units')
plt.show()